Database
 sql >> Base de données >  >> RDS >> Database

SQL DROP COLUMN pour les débutants

En SQL, si vous souhaitez supprimer une colonne d'une table, vous devez utiliser le ALTER TABLE instruction avec DROP COLUMN clause.

Cela supprime la colonne et toutes ses données.

Syntaxe

La syntaxe ressemble à ceci :

ALTER TABLE table_name 
DROP COLUMN column_name;

Certains SGBDR acceptent un IF EXISTS facultatif argument qui signifie qu'il ne renverra pas d'erreur si la colonne n'existe pas.

Certains RDBMS acceptent également l'option CASCADE et RESTRICT arguments, qui spécifient ce qu'il faut faire si la colonne a des dépendances. Voir ci-dessous pour plus d'informations à ce sujet.

Exemple

Voici un exemple pour illustrer.

ALTER TABLE Products 
DROP COLUMN ProductDescription;

Cela supprime le ProductDescription colonne de la colonne Products tableau.

Le IF EXISTS Argumentation

En fonction de votre SGBDR, vous pourrez peut-être utiliser le IF EXISTS argument, qui supprime conditionnellement la colonne uniquement si elle existe déjà.

L'avantage est que vous n'obtiendrez pas d'erreur si la colonne n'existe pas.

Exemple :

ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;

Restreindre la modification

Selon votre SGBDR, vous pourrez peut-être utiliser la CASCADE et RESTRICT arguments pour spécifier ce qu'il faut faire si la colonne a des dépendances, telles que des clés étrangères ou des vues.

RESTRICT est généralement le comportement par défaut, donc si vous ne spécifiez aucun de ces arguments, le SGBD refusera de supprimer la colonne s'il y a des objets dépendants.

Exemple :

ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;

Lorsque vous utilisez l'instruction ci-dessus, si la colonne a des dépendances, l'opération de suppression échouera et vous obtiendrez une erreur.

Voici l'erreur que j'obtiens dans PostgreSQL lorsque j'essaie de supprimer une table référencée par une vue :

cannot drop column productdescription of table products because other objects depend on it

Cascadez le changement

Utilisation de la CASCADE l'option entraînera la suppression de tous les objets dépendants.

Voici ce qui se passe si je change l'exemple précédent en CASCADE :

ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;

Résultat :

NOTICE: drop cascades to view vproducts
Commands completed successfully

Dans ce cas, la colonne a été supprimée et j'ai reçu un message expliquant que la vue appelée vproducts a également été supprimé.

CASCADE et RESTRICT sont pris en charge dans PostgreSQL, mais pas dans SQL Server ou MySQL. Les deux mots-clés peuvent être utilisés dans MariaDB mais ils n'ont aucun effet.

Oracle accepte une CASCADE CONSTRAINTS clause qui supprime toutes les contraintes de clé étrangère faisant référence aux clés primaires et uniques définies sur les colonnes supprimées ainsi que toutes les contraintes multicolonnes définies sur les colonnes supprimées.

Supprimer plusieurs colonnes

Certains RDBM vous permettent de supprimer plusieurs colonnes dans un seul ALTER TABLE déclaration. La syntaxe varie d'un SGBDR à l'autre.

Dans SQL Server, vous pouvez simplement lister chaque colonne, séparée par une virgule :

ALTER TABLE t1 
DROP COLUMN c1, c2;

Dans d'autres SGBDR (tels que MySQL et PostgreSQL), vous devrez réécrire DROP COLUMN pour chaque colonne :

ALTER TABLE t1 
DROP COLUMN c1, DROP COLUMN c2;

Notez que cette syntaxe est une extension de SQL et qu'elle n'est pas conforme au standard SQL de n'avoir qu'un seul DROP clause par ALTER TABLE déclaration.

Supprimer la dernière colonne

Certains RDBM vous permettent de supprimer la dernière colonne du tableau, laissant ainsi un tableau vide sans colonnes. Il s'agit d'une extension du standard SQL (qui n'autorise pas les tables sans colonne).

Par exemple, dans PostgreSQL, j'ai utilisé l'instruction suivante pour supprimer la dernière colonne restante dans la table

ALTER TABLE t1 
DROP COLUMN c3;

Résultat :

Commands completed successfully

Mais dans SQL Server, si je fais la même chose :

ALTER TABLE t1 
DROP COLUMN c1, c2, c3;

Résultat :

Msg 4923, Level 16, State 1, Line 1
ALTER TABLE DROP COLUMN failed because 'c3' is the only data column in table 't1'. A table must have at least one data column.

Notez que malgré le libellé de ce message d'erreur, c3 n'était pas la seule colonne restante. Il y avait en fait trois colonnes. Cependant, c3 aurait été le dernier restant si les deux autres avaient été abandonnés. Dans ce cas, aucune des trois colonnes n'a été supprimée.

Quoi qu'il en soit, même si je supprimais les deux autres, SQL Server refuserait de supprimer le dernier.

MySQL refuse également de supprimer la dernière colonne d'une table.

Si votre intention est de supprimer la table, utilisez DROP TABLE .

Restrictions par RDBMS

Bien que la base DROP COLUMN La syntaxe est assez similaire dans la plupart des principaux SGBDR, chaque SGBDR a tendance à avoir ses propres restrictions quant au moment où une colonne sera ou ne sera pas supprimée.

Voici quelques-unes des restrictions de certains des principaux SGBDR.

SQL Server

Une colonne ne peut pas être supprimée lorsqu'elle est :

  • Utilisé dans un index, que ce soit comme colonne clé ou comme INCLUDE
  • Utilisé dans un CHECK , FOREIGN KEY , UNIQUE , ou PRIMARY KEY contrainte.
  • Associé à une valeur par défaut définie avec le DEFAULT mot-clé ou lié à un objet par défaut.
  • Lié à une règle.

Source pour SQL Server :https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql

MySQL

Si des colonnes sont supprimées d'une table, les colonnes sont également supprimées de tout index dont elles font partie. Si toutes les colonnes qui composent un index sont supprimées, l'index est également supprimé.

Source pour MySQL :https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

PostgreSQL

Les index et les contraintes de table impliquant la colonne seront également supprimés automatiquement.

Les statistiques multivariées faisant référence à la colonne supprimée seront également supprimées si la suppression de la colonne a pour effet que les statistiques contiennent des données pour une seule colonne.

Vous devrez utiliser CASCADE si quelque chose en dehors de la table dépend de la colonne, par exemple, des clés étrangères ou des vues.

Source pour PostgreSQL :https://www.postgresql.org/docs/current/sql-altertable.html

SQLite

SQLite ne prend pas en charge la DROP COLUMN syntaxe. Vous ne pouvez pas supprimer une colonne dans SQLite.

Si vous devez supprimer une colonne dans SQLite, il est recommandé de suivre le processus en 12 étapes recommandé dans la documentation SQLite.

Source pour SQLite :https://sqlite.org/lang_altertable.html#otheralter

MariaDB

Si la colonne fait partie d'un index, la colonne en sera supprimée, sauf si vous ajoutez une nouvelle colonne avec un nom identique en même temps. L'index sera supprimé si toutes les colonnes de l'index ont été supprimées. Si la colonne a été utilisée dans une vue ou un déclencheur, vous obtiendrez une erreur lors du prochain accès à la vue ou au déclencheur.

À partir de MariaDB 10.2.8, suppression d'une colonne faisant partie d'un UNIQUE multi-colonnes la contrainte n'est pas autorisée.

MariaDB accepte RESTRICT et CASCADE afin de faciliter le portage depuis d'autres systèmes de base de données, mais dans MariaDB, ils ne font rien.

MariaDB 10.4.0 prend en charge la DROP COLUMN instantanée . DROP COLUMN d'une colonne indexée impliquerait DROP INDEX (et dans le cas d'un non-UNIQUE index multi-colonnes, éventuellement ADD INDEX ). Ceux-ci ne seront pas autorisés avec ALGORITHM=INSTANT , mais contrairement à avant, ils peuvent être autorisés avec ALGORITHM=NOCOPY .

Source pour MariaDB :https://mariadb.com/kb/en/alter-table/#drop-column