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

292

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

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

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Especifica que restricción_nombre o columna_nombre se elimina de la tabla. DROP COLUMN no está permitido si el nivel de compatibilidad es 65 o anterior. Se pueden enumerar múltiples columnas y restricciones.

Dice que varias columnas se pueden enumerar en la declaración, pero la sintaxis no muestra una coma opcional ni nada que incluso sugiera la sintaxis.

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

Jesse Webb
fuente

Respuestas:

431

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 COLUMN Column1,
    DROP COLUMN Column2;

o como este 1 :

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1 La palabra COLUMNes opcional y puede omitirse, excepto para RENAME COLUMN(para distinguir una operación de cambio de nombre de columna de la operación de cambio de nombre de RENAMEtabla). Más información aquí .

Alex Aza
fuente
1
@Gweebz: supongo que el error que tuvo estuvo relacionado con el uso de la columna. La columna podría usarse en una restricción, índice u otra columna calculada.
Alex Aza
Precisamente; La segunda columna que tenía se usó en un índice. Dejé caer ese índice y mi declaración DROP funcionó perfectamente después de eso.
Jesse Webb
@jeicam: eso podría haber sucedido probablemente porque una de las columnas que está tratando de eliminar podría ser una clave principal.
Benny
196

Resumiendo

Oráculo :

ALTER TABLE table_name DROP (column_name1, column_name2);

Servidor MS SQL :

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;

Se consciente

DROP COLUMNno elimina físicamente los datos de algunos DBMS. Por ejemplo, para MS SQL. Para los tipos de longitud fija ( int , numérico , flotante , fecha y hora , identificador único , etc.), el espacio se consume incluso para los registros agregados después de que se descartaron las columnas. Para deshacerse del espacio desperdiciado hacer ALTER TABLE ... REBUILD.

Denis Rozhnev
fuente
3
Para PostgreSQL, incluso puede omitir COLUMNpalabras clave como en MySql.
Artem Novikov
1
También puede usar el mismo formato para MySQL que para MS SQL y Postgre SQL: ALTER TABLE table_name DROP COLUMN column_name1, column_name2;
jciloa
¡Gracias por expandir las respuestas a otros proveedores de DB!
KJP
39
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, numérico, flotante, fecha-hora, identificador único, etc.) el espacio se consume incluso para los registros agregados después de que se descartaron las columnas. Para deshacerse del espacio desperdiciado hacer ALTER TABLE ... REBUILD.

Remus Rusanu
fuente
11
+1 para la nota sobre tamaños de mesa y que requieren un RECONSTRUCCIÓN. ¿Puede proporcionar un enlace a la documentación como referencia?
Jesse Webb
2
Justo en la TABLA
ALTERACIÓN
44
Hablé con mi DBA sobre hacer un RECONSTRUCCIÓN y él dijo que si la mesa tuviera un índice agrupado (que el mío tenía), podría correr ALTER INDEX PK_IndexName ON TableName REBUILDy recuperar el espacio. Esto se describe aquí: msdn.microsoft.com/en-us/library/ms189858.aspx en la sección "Reconstrucción de un índice".
Jesse Webb
1
Cualquiera puede arrojar algo de luz sobre ¿POR QUÉ esto se implementaría así? Si eliminé la columna, espero que desaparezcan los índices, los datos y todo lo creado en esa columna. Dejar espacio desperdiciado sin tanta advertencia parece una mala práctica, ¿o me estoy perdiendo algo?
DanteTheSmith
13

Esto puede llegar tarde, pero compartirlo con los nuevos usuarios que visiten esta pregunta. Para soltar varias columnas, la sintaxis real es

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

Entonces, para cada columna, debe especificar "soltar columna" en Mysql 5.0.45.

ZOPE MANISH
fuente
Esta es una sintaxis incorrecta. Uso: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1
@Graeme, la sintaxis es correcta, la he probado y funciona si uso: ALTER TABLE Test DROP COLUMN c1, c2; Mysql arroja un error. ... cerca de c2
Tom Mwenda
66
@TomBikiNurse La pregunta tiene una referencia de MSDN, por lo tanto, se supuso que el SQL en cuestión está relacionado con MS SQL Server y no con MySQL
Surya Pratap
Esta es la sintaxis real. las respuestas mejor votadas son incorrectas.
Vardumper
@SuryaPratap La pregunta menciona 'mi SQL' en el último párrafo.
Eternal21
4

La sintaxis especificada por Microsoft para colocar una parte de columna de una instrucción ALTER es esta

 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 la cláusula drop completa. Lo que esto significa es que hay dos formas 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;

Al soltar columnas, SQL Sever no reclama el espacio ocupado por las columnas soltadas. 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. Por ejemplo:

ALTER TABLE Test
    REBUILD;
Martin Brown
fuente
3

Para MySQL (ver 5.6), no puede hacer soltar múltiples columnas con una sola dropdeclaración sino más bien con varias dropdeclaraciones:

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>es corto drop column <col_name>como se puede ver desde drop c3arriba.

CSY
fuente
2

Si es solo una columna para eliminar, la sintaxis siguiente funciona

ALTER TABLE tablename DROP COLUMN column1;

Para eliminar varias columnas, el uso de no DROP COLUMNfunciona, la sintaxis siguiente funciona

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

kk250040
fuente
1
alter table tablename drop (column1, column2, column3......);
Neelima
fuente
Esta es una sintaxis incorrecta. Uso: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1

Genérico:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

P.ej:

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

esta consulta alterará la prueba de múltiples columnas.

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

alter table test drop(a,B);
Ratan Nahak
fuente
Esta es una sintaxis incorrecta. Uso: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

para MySQL DB.

O puede agregar alguna columna mientras se modifica en la misma línea:

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