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


292

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

MSDN的ALTER TABLE文档中 ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

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

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

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

Answers:


431

对于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表重命名操作)。更多信息在这里


1
@Gweebz-我假设您所犯的错误与列用法有关。列可以在约束,索引或其他计算列中使用。
Alex Aza

精确地 我在索引中使用的第二列。我删除了该索引,此后我的DROP语句运行完美。
杰西·韦伯

@jeicam-之所以会这样,可能是因为您要删除的列之一可能是主键。
本尼

196

总结

甲骨文

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。对于固定长度类型(intnumericfloatdatetimeuniqueidentifier等),即使删除列后添加的记录也要占用空间。摆脱浪费的空间ALTER TABLE ... REBUILD


3
对于PostgreSQL,您甚至可以COLUMN像MySql中那样省略关键字。
Artem Novikov

1
对于MySQL,也可以使用与MS SQL和Postgre SQL相同的格式:ALTER TABLE table_name DROP COLUMN column_name1,column_name2;
jciloa

感谢您将答案扩展到其他数据库供应商!
KJP

39
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

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


11
+1表示有关表大小和需要重新构建的注释。您能否提供文档链接作为参考?
杰西·韦伯


4
我和我的DBA谈过要进行重建的问题,他说如果表具有聚集的索引(我的这样做),我可以运行ALTER INDEX PK_IndexName ON TableName REBUILD并回收空间。此处对此进行了一些描述:msdn.microsoft.com/en-us/library/ms189858.aspx在“重建索引”部分下。
Jesse Webb

1
任何人都可以阐明为什么会这样实施吗?如果我删除了列,我希望索引,数据以及基于该列构建的所有内容都将消失。浪费空间而没有警告,这似乎是一种不好的做法,还是我错过了什么?
DanteTheSmith '17

13

这可能已经晚了,但是将其共享给访问此问题的新用户。要删除多列,实际语法是

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

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


这是不正确的语法。使用:ALTER TABLE Test DROP COLUMN c1,c2;
Graeme 2013年

1
@Graeme语法是正确的,如果已经使用,我已经对其进行了测试,并且可以工作:ALTER TABLE Test DROP COLUMN c1,c2; Mysql引发错误。...在c2附近
Tom Mwenda

6
@TomBikiNurse这个问题有一个MSDN参考,因此假定所讨论的SQL与MS SQL Server有关,而与MySQL不相关
Surya Pratap 2013年

这是实际的语法。投票得更好的答案是错误的。
Vardumper '16

@SuryaPratap问题在上一段中确实提到了“我的SQL”。
Eternal21 '17

4

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;

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上面。


2

如果只是单列删除,则以下语法有效

ALTER TABLE tablename DROP COLUMN column1;

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

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


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

这是不正确的语法。使用:ALTER TABLE Test DROP COLUMN c1,c2;
Graeme 2013年



0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

对于MySQL DB。

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

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.