我想编写一个SQL命令,在一个ALTER table语句中删除单个表中的多个列。

从MSDN的ALTER TABLE文档…

DROP {[CONSTRAINT] constraint_name | COLUMN column_name} 指定从表中删除constraint_name或column_name。如果兼容级别为65或更早,则不允许使用DROP COLUMN。可以列出多个列和约束。

它说可以在语句中列出多个列,但语法没有显示可选的逗号或任何暗示语法的东西。

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


当前回答

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

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

alter table test drop(a,B);

其他回答

对于SQL Server:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

语法是

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

MySQL:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

或者像这样:

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

COLUMN这个词是可选的,可以省略,除了RENAME COLUMN(用来区分列重命名操作和RENAME表重命名操作)。更多信息请点击这里。

alter table tablename drop (column1, column2, column3......);

对于MySQL(5.6版本),你不能用一个drop-statement来执行多个drop-statement,而是使用多个drop-statement:

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 <col_name>是drop column <col_name>的缩写,正如您可以从上面的drop c3中看到的那样。

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

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

alter table test drop(a,B);
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…重建。