348

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

MSDN 的 ALTER TABLE 文档...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

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

它说可以在语句中列出多个列,但语法不显示可选的逗号或任何甚至暗示语法的内容。

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

4

12 回答 12

518

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

或像这样1

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

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

于 2011-06-14T15:37:27.280 回答
215

总结

甲骨文

ALTER TABLE table_name DROP (column_name1, column_name2);

微软 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;

意识到

DROP COLUMN不会物理删除某些 DBMS 的数据。例如对于 MS SQL。对于固定长度类型(intnumericfloatdatetimeuniqueidentifier等),即使在删除列后添加的记录也会消耗空间。要摆脱浪费的空间呢ALTER TABLE ... REBUILD

于 2013-09-01T23:45:56.683 回答
39
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

于 2011-06-14T15:36:48.273 回答
14

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

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

因此,对于每一列,您需要在 Mysql 5.0.45 中指定“删除列”。

于 2013-03-11T05:55:44.027 回答
5

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

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

ALTER TABLE Test
    REBUILD;
于 2015-01-28T13:14:31.463 回答
3

对于 MySQL(5.6 版),您不能使用单个drop语句执行多列删除,而是使用多个drop语句:

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

于 2013-08-11T14:23:38.070 回答
2

如果只是删除以下语法的单列

ALTER TABLE tablename DROP COLUMN column1;

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

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

于 2013-06-14T05:18:56.177 回答
1
alter table tablename drop (column1, column2, column3......);
于 2013-04-19T04:51:32.097 回答
1

通用的:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

例如:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;
于 2015-08-13T13:30:04.467 回答
1

因为 postgis 是

alter table table01 drop columns col1, drop col2

于 2020-10-13T17:50:21.310 回答
0

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

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

alter table test drop(a,B);
于 2013-05-15T09:44:07.073 回答
0
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;
于 2016-09-14T06:44:48.500 回答