¿Cómo eliminar varias columnas con una sola instrucción ALTER TABLE en SQL Server?


Me gustaría escribir un solo comando SQL para soltar varias columnas de una sola tabla en una instrucción ALTER TABLE.

De La documentación ALTER TABLE de MSDN...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Especifica que constraint_name o column_name se elimina de la tabla. La COLUMNA DROP no está permitida si el nivel de compatibilidad es 65 o anterior. Se pueden enumerar varias columnas y restricciones.

Dice que las columnas mutliple se pueden enumerar en la instrucción the pero la la sintaxis no muestra una coma opcional ni nada que pueda sugerir la sintaxis.

¿Cómo debo escribir mi SQL para soltar varias columnas en una instrucción (si es posible)?

Author: Steve Chambers, 2011-06-14

12 answers

Para SQL Server:

alter table TableName
    drop column Column1, Column2

La sintaxis es

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

Para MySQL:

alter table TableName
    drop Column1, drop Column2
 327
Author: Alex Aza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-07 10:37:30

Resumiendo

Oracle:

ALTER TABLE table_name DROP (column_name1, column_name2);

MS SQL :

ALTER TABLE table_name DROP COLUMN column_name1, column_name2

MySql:

ALTER TABLE table_name DROP column_name1, DROP column_name2;

Postgre SQL

ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2;

Tenga en cuenta

LA COLUMNA DROP no elimina físicamente los datos de algunos DBMS. Por ejemplo, para MS SQL. Para tipos de longitud fija (int, numeric, float, datetime, uniqueidentifier, etc.) el espacio se consume incluso para los registros agregados después de que se eliminaron las columnas. Para deshacerse del espacio desperdiciado, ALTERE LA TABLA ... RECONSTRUIR.

 164
Author: dir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-29 17:22:43
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

Tenga en cuenta que DROP COLUMN no elimina físicamente los datos, y para los tipos de longitud fija (int, numeric, float, datetime, uniqueidentifier, etc.) el espacio se consume incluso para los registros agregados después de que se eliminaron las columnas. Para deshacerse del espacio desperdiciado haga ALTER TABLE ... REBUILD.

 35
Author: Remus Rusanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-14 15:36:48

Esto puede ser tarde, pero compartirlo para los nuevos usuarios que visitan esta pregunta. Para soltar varias columnas la sintaxis real es

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

Así que para cada columna necesita especificar "drop column" en Mysql 5.0.45.

 10
Author: MANISH ZOPE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-24 12:16:27

La sintaxis especificada por Microsoft para eliminar una parte de columna de una instrucción ALTER es la siguiente

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

Observe que el [,...n] aparece después del nombre de la columna y al final de toda la cláusula drop. Lo que esto significa es que hay dos maneras de eliminar varias columnas. Puedes hacer esto:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

O esto

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

Esta segunda sintaxis es útil si desea combinar la caída de una columna con la caída de una restricción:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Cuando soltar columnas SQL Sever no recupera el espacio ocupado por las columnas abandonadas. Para los tipos de datos que se almacenan en línea en las filas (int, por ejemplo), incluso puede ocupar espacio en las nuevas filas agregadas después de la instrucción alter. Para evitar esto, debe crear un índice agrupado en la tabla o reconstruir el índice agrupado si ya tiene uno. La reconstrucción del índice se puede hacer con un comando REBUILD después de modificar la tabla. Pero tenga en cuenta que esto puede ser lento en mesas muy grandes. Para ejemplo:

ALTER TABLE Test
    REBUILD;
 4
Author: Martin Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-28 13:14:31

Para MySQL (ver 5.6), no se puede hacer la caída de varias columnas con una sola drop-sentencia, sino más bien múltiples drop - sentencias:

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> 

POR cierto, drop <col_name> está corto de drop column <col_name> como se puede ver en drop c3 arriba.

 3
Author: CSY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-11 14:46:02

Si es solo una columna para eliminar la siguiente sintaxis funciona

ALTER TABLE tablename DROP COLUMN column1;

Para eliminar varias columnas, usando el DROP COLUMN no funciona, la siguiente sintaxis funciona

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

 2
Author: kk250040,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-14 05:38:57
alter table tablename drop (column1, column2, column3......);
 1
Author: Neelima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-19 05:09:22

Genérico:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Por ejemplo:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;
 1
Author: Chirag Thakar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-13 13:30:04

Esta consulta alterará la prueba de columna múltiple.

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

alter table test drop(a,B);
 0
Author: Ratan Nahak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-15 10:02:45
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

Para MySQL DB.

O puedes añadir alguna columna mientras alteras en la misma línea:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
 0
Author: naveen vaishnav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-14 07:19:55

Intente las siguientes consultas:

alter table table_name add field_name data_type

O

alter table table_name drop column field_name

O

alter table table_name drop field_name
 -6
Author: Sasi KM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-13 13:33:28