Comment supprimer plusieurs colonnes avec une seule instruction ALTER TABLE dans SQL Server?

292

Je voudrais écrire une seule commande SQL pour supprimer plusieurs colonnes d'une même table dans une seule ALTER TABLEinstruction.

À partir de la documentation ALTER TABLE de MSDN ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Spécifie que nom_contrainte ou nom_colonne est supprimé de la table. DROP COLUMN n'est pas autorisé si le niveau de compatibilité est 65 ou antérieur. Plusieurs colonnes et contraintes peuvent être répertoriées.

Il indique que plusieurs colonnes peuvent être répertoriées dans l'instruction, mais la syntaxe n'affiche pas de virgule facultative ou tout ce qui pourrait même faire allusion à la syntaxe.

Comment dois-je écrire mon SQL pour supprimer plusieurs colonnes dans une seule instruction (si possible)?

Jesse Webb
la source

Réponses:

431

Pour SQL Server:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

La syntaxe est

DROP { [ CONSTRAINT ] constraint_name | COLUMN column } [ ,...n ] 

Pour MySQL:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

ou comme ça 1 :

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1 Le mot COLUMNest facultatif et peut être omis, à l'exception de RENAME COLUMN(pour distinguer une opération de changement de nom de colonne de l'opération de changement de nom de RENAMEtable). Plus d'infos ici .

Alex Aza
la source
1
@Gweebz - Je suppose que l'erreur que vous avez eue était liée à l'utilisation des colonnes. La colonne peut être utilisée dans une contrainte, un index ou une autre colonne calculée.
Alex Aza
Précisément; la deuxième colonne que j'avais était utilisée dans un index. J'ai supprimé cet index et ma déclaration DROP a parfaitement fonctionné après cela.
Jesse Webb
@jeicam - Cela se serait produit probablement parce que 1 des colonnes que vous essayez de supprimer pourrait être une clé primaire.
Benny
196

Résumer

Oracle :

ALTER TABLE table_name DROP (column_name1, column_name2);

MS SQL Server :

ALTER TABLE table_name DROP COLUMN column_name1, column_name2

MySQL :

ALTER TABLE table_name DROP column_name1, DROP column_name2;

PostgreSQL

ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2;

Être conscient

DROP COLUMNne supprime pas physiquement les données de certains SGBD. Par exemple pour MS SQL. Pour les types de longueur fixe ( int , numérique , float , datetime , uniqueidentifier, etc.), l'espace est consommé même pour les enregistrements ajoutés après la suppression des colonnes. Pour se débarrasser de l'espace perdu, faites-le ALTER TABLE ... REBUILD.

Denis Rozhnev
la source
3
Pour PostgreSQL, vous pouvez même omettre des COLUMNmots clés comme dans MySql.
Artem Novikov
1
Vous pouvez également utiliser le même format pour MySQL que pour MS SQL et Postgre SQL: ALTER TABLE nom_table DROP COLUMN nom_colonne1, nom_colonne2;
jciloa
Merci d'avoir étendu les réponses à d'autres fournisseurs de bases de données!
KJP
39
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

Sachez que DROP COLUMN ne supprime pas physiquement les données et que pour les types de longueur fixe (int, numérique, float, datetime, uniqueidentifier, etc.), l'espace est consommé même pour les enregistrements ajoutés après la suppression des colonnes. Pour se débarrasser de l'espace perdu, faites-le ALTER TABLE ... REBUILD.

Remus Rusanu
la source
11
+1 pour la note sur les tailles de table et nécessitant une RECONSTRUCTION. Pouvez-vous fournir un lien vers la documentation comme référence?
Jesse Webb
2
Juste là dans le ALTER TABLE: msdn.microsoft.com/en-us/library/ms190273.aspx
Remus Rusanu
4
J'ai parlé à mon administrateur de base de données de faire une RECONSTRUCTION et il a dit que si la table avait un index clusterisé (comme le mien), je pouvais simplement courir ALTER INDEX PK_IndexName ON TableName REBUILDet il récupérerait l'espace. Ceci est quelque peu décrit ici: msdn.microsoft.com/en-us/library/ms189858.aspx dans la section "Reconstruction d'un index".
Jesse Webb
1
N'importe qui peut nous éclairer POURQUOI cela serait-il mis en œuvre de la sorte? Si j'ai supprimé la colonne, je m'attends à ce que les index, les données et tout ce qui est construit sur cette colonne disparaissent. Laisser de l'espace gaspillé sans autant d'avertissement semble être une mauvaise pratique, ou manque-t-il quelque chose?
DanteTheSmith
13

Cela peut être en retard, mais le partager pour les nouveaux utilisateurs visitant cette question. Pour supprimer plusieurs colonnes, la syntaxe réelle est

alter table tablename drop column col1, drop column col2 , drop column col3 ....

Donc, pour chaque colonne, vous devez spécifier "drop column" dans Mysql 5.0.45.

MANISH ZOPE
la source
Il s'agit d'une syntaxe incorrecte. Utilisation: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1
@Graeme la syntaxe est correcte, je l'ai testée et ça marche, si j'utilise: ALTER TABLE Test DROP COLUMN c1, c2; Mysql renvoie une erreur. ... près de c2
Tom Mwenda
6
@TomBikiNurse La question a une référence MSDN donc il a été supposé que le SQL en question est lié à MS SQL Server et non à MySQL
Surya Pratap
c'est la syntaxe réelle. les meilleures réponses votées sont fausses.
Vardumper
@SuryaPratap La question mentionne «mon SQL» dans le dernier paragraphe.
Eternal21
4

La syntaxe spécifiée par Microsoft pour la suppression d'une partie de colonne d'une instruction ALTER est la suivante

 DROP 
 {
     [ CONSTRAINT ] 
     { 
          constraint_name 
          [ WITH 
           ( <drop_clustered_constraint_option> [ ,...n ] ) 
          ] 
      } [ ,...n ]
      | COLUMN 
      {
          column_name 
      } [ ,...n ]
 } [ ,...n ]

Notez que le [, ... n] apparaît après le nom de la colonne et à la fin de la clause drop complète. Cela signifie qu'il existe deux façons de supprimer plusieurs colonnes. Vous pouvez soit le faire:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

ou ca

ALTER TABLE TableName
    DROP 
        COLUMN Column1,
        COLUMN Column2,
        COLUMN Column3

Cette deuxième syntaxe est utile si vous souhaitez combiner la suppression d'une colonne avec la suppression d'une contrainte:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Lors de la suppression de colonnes, SQL Sever ne récupère pas l'espace occupé par les colonnes supprimées. Pour les types de données qui sont stockés en ligne dans les lignes (int par exemple), il peut même occuper de l'espace sur les nouvelles lignes ajoutées après l'instruction alter. Pour contourner ce problème, vous devez créer un index cluster sur la table ou reconstruire l'index cluster s'il en a déjà un. La reconstruction de l'index peut être effectuée avec une commande REBUILD après avoir modifié la table. Mais attention, cela peut être lent sur de très grandes tables. Par exemple:

ALTER TABLE Test
    REBUILD;
Martin Brown
la source
3

Pour MySQL (ver 5.6), vous ne pouvez pas faire de dropsaut de colonnes multiples avec une seule déclaration mais plutôt plusieurs dropdéclarations:

mysql> alter table test2 drop column (c1,c2,c3);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(c1,c2,c3)' at line 1
mysql> alter table test2 drop column c1,c2,c3;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'c2,c3' at line 1
mysql> alter table test2 drop column c1, drop column c2, drop c3;
Query OK, 0 rows affected (0.64 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 

BTW, drop <col_name>est un raccourci drop column <col_name>comme vous pouvez le voir drop c3ci-dessus.

CSY
la source
2

S'il ne s'agit que d'une seule colonne pour supprimer les travaux de syntaxe ci-dessous

ALTER TABLE tablename DROP COLUMN column1;

Pour supprimer plusieurs colonnes, en utilisant le ne DROP COLUMNfonctionne pas, la syntaxe ci-dessous fonctionne

ALTER TABLE tablename DROP (column1, column2, column3......);

kk250040
la source
1
alter table tablename drop (column1, column2, column3......);
Neelima
la source
Il s'agit d'une syntaxe incorrecte. Utilisation: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1

Générique:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Par exemple:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;
Chirag Thakar
la source
0

cette requête modifiera le test sur plusieurs colonnes.

create table test(a int,B int,C int);

alter table test drop(a,B);
Ratan Nahak
la source
Il s'agit d'une syntaxe incorrecte. Utilisation: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

pour MySQL DB.

Ou vous pouvez ajouter une colonne tout en modifiant dans la même ligne:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
naveen vaishnav
la source