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

我想写一个SQL命令,在一个ALTER TABLE语句中从一个表中删除多个列。

MSDN的ALTER TABLE文档

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

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

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

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

525571 次浏览
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

对于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;

或类似this1:

ALTER TABLE TableName
DROP Column1,
DROP Column2;

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

这可能有点晚了,但是分享给访问这个问题的新用户。 删除多列的实际语法是

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

因此,在Mysql 5.0.45中,你需要为每一列指定“drop column”。

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

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

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


alter table test drop(a,B);

如果只是单列删除,下面的语法是可行的

ALTER TABLE tablename DROP COLUMN column1;

对于删除多个列,使用DROP COLUMN不起作用,下面的语法可以

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

对于MySQL(5.6版),你不能用一个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中看到。

总结

甲骨文:

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;

请注意

DROP COLUMN不会为某些DBMS删除数据。例如,MS SQL。对于固定长度类型(int数字浮动datetimeuniqueidentifier等),即使在删除列之后添加的记录也会占用空间。要摆脱浪费的空间,请执行ALTER TABLE ... REBUILD

微软为改变语句中删除列部分指定的语法是这样的

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

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

ALTER TABLE TableName
DROP COLUMN Column1, Column2, Column3

或者这个

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

如果你想把删除列和删除约束结合起来,这第二个语法是有用的:

ALTER TBALE TableName
DROP
CONSTRAINT DF_TableName_Column1,
COLUMN Column1;

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

ALTER TABLE Test
REBUILD;

泛型:

ALTER TABLE table_name
DROP COLUMN column1,column2,column3;

例句:

ALTER TABLE Student
DROP COLUMN Name, Number, City;
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

MySQL数据库。

或者你可以添加一些列,同时改变在同一行:

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

postgis是

alter table table01 drop columns col1, drop col2