如何在SQL Server中使用单个ALTER TABLE语句删除多个列?

How to DROP multiple columns with a single ALTER TABLE statement in SQL Server?

我想编写一个SQL命令来从一个ALTER TABLE语句中的单个表中删除多个列。

来自MSDN的ALTER TABLE文档......

1
DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Specifies that constraint_name or column_name is removed from the table. DROP COLUMN is not allowed if the compatibility level is 65 or earlier. Multiple columns and constraints can be listed.

它说mutliple列可以在语句中列出,但语法不显示可选的逗号或任何甚至暗示语法的东西。

我应该如何编写SQL以在一个语句中删除多个列(如果可能)?


对于SQL Server:

1
2
ALTER TABLE TableName
    DROP COLUMN Column1, Column2

语法是

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

对于MySQL:

1
2
ALTER TABLE TableName
    DROP Column1, DROP Column2


总结

甲骨文:

1
ALTER TABLE TABLE_NAME DROP (column_name1, column_name2);

MS SQL:

1
ALTER TABLE TABLE_NAME DROP COLUMN column_name1, column_name2

MySQL的:

1
ALTER TABLE TABLE_NAME DROP column_name1, DROP column_name2;

Postgre SQL

1
ALTER TABLE TABLE_NAME DROP COLUMN column_name1, DROP COLUMN column_name2;

意识到

DROP COLUMN不会为某些DBMS物理删除数据。例如。对于MS SQL。对于固定长度类型(int,numeric,float,datetime,uniqueidentifier等),即使对于删除列后添加的记录,也会占用空间。为了摆脱浪费的空间,请做ALTER TABLE ... REBUILD。


1
2
CREATE TABLE test (a INT, b INT , c INT, d INT);
ALTER TABLE test DROP COLUMN b, d;

请注意,DROP COLUMN不会物理删除数据,对于固定长度类型(int,numeric,float,datetime,uniqueidentifier等),即使对于删除列后添加的记录,也会占用空间。要摆脱浪费的空间,请ALTER TABLE ... REBUILD


这可能会迟到,但会为访问此问题的新用户分享。
要删除多列实际语法是

1
ALTER TABLE tablename DROP COLUMN col1, DROP COLUMN col2 , DROP COLUMN col3 ....

因此,对于每个列,您需要在Mysql 5.0.45中指定"drop column"。


Microsoft指定删除ALTER语句的列部分的语法是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 DROP
 {
     [ CONSTRAINT ]
     {
          constraint_name
          [ WITH
           ( <drop_clustered_constraint_option> [ ,...n ] )
          ]
      } [ ,...n ]
      | COLUMN
      {
          column_name
      } [ ,...n ]
 } [ ,...n ]

请注意,[,... n]出现在列名称之后和整个drop子句的末尾。这意味着有两种方法可以删除多个列。你可以这样做:

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

或这个

1
2
3
4
5
ALTER TABLE TableName
    DROP
        COLUMN Column1,
        COLUMN Column2,
        COLUMN Column3

如果要将列的删除与删除约束相结合,则第二种语法很有用:

1
2
3
4
ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

删除列时,SQL Sever不会回收已删除列所占用的空间。对于以行内联存储的数据类型(例如int),它甚至可能占用alter语句后添加的新行的空间。要解决此问题,您需要在表上创建聚簇索引,或者重建聚簇索引(如果已有)。修改表后,可以使用REBUILD命令重建索引。但请注意,在非常大的桌子上这可能会很慢。例如:

1
2
ALTER TABLE Test
    REBUILD;

对于MySQL(版本5.6),您不能使用一个drop -statement进行多列删除,而是使用多个drop -statements:

1
2
3
4
5
6
7
8
9
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>

从上面的drop c3可以看出,BTW,drop drop column 的缩写。


如果只是单列删除下面的语法工作

ALTER TABLE tablename DROP COLUMN column1;

要删除多个列,使用DROP COLUMN不起作用,以下语法有效

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


通用:

1
2
ALTER TABLE TABLE_NAME
DROP COLUMN column1,column2,column3;

例如:

1
2
ALTER TABLE Student
DROP COLUMN Name, NUMBER, City;

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


1
ALTER TABLE TABLE_NAME DROP COLUMN column1, DROP COLUMN column2,DROP COLUMN column3;

对于MySQL DB。

或者您可以在同一行中更改时添加一些列:

1
ALTER TABLE TABLE_NAME DROP COLUMN column1, ADD COLUMN column2 AFTER column7;

此查询将改变多列测试它。

1
2
3
CREATE TABLE test(a INT,B INT,C INT);

ALTER TABLE test DROP(a,B);


尝试以下查询:

1
ALTER TABLE TABLE_NAME ADD field_name data_type

要么

1
ALTER TABLE TABLE_NAME DROP COLUMN field_name

要么

1
ALTER TABLE TABLE_NAME DROP field_name