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

时间:2011-06-14 15:32:34

标签: sql sql-server tsql alter

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

来自MSDN's ALTER TABLE documentation ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }
     

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

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

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

14 个答案:

答案 0 :(得分:364)

对于SQL Server:

alter table TableName
    drop column Column1, Column2

语法是

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

对于MySQL:

alter table TableName
    drop Column1, drop Column2

答案 1 :(得分:183)

综述

Oracle

ALTER TABLE table_name DROP (column_name1, column_name2);

MS SQL

ALTER TABLE table_name DROP COLUMN column_name1, column_name2

MySql

ALTER TABLE table_name DROP column_name1, DROP column_name2;

Postgre SQL

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。

答案 2 :(得分:38)

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

答案 3 :(得分:12)

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

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

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

答案 4 :(得分: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;

答案 5 :(得分: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>的{​​{1}}是drop column <col_name>的缩写,正如您从上面的drop c3所看到的那样。

答案 6 :(得分:2)

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

ALTER TABLE tablename DROP COLUMN column1;

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

<强>通用

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

例如:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;

答案 9 :(得分:1)

对于邮递员是

alter table table01 drop columns col1, drop col2

答案 10 :(得分:0)

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

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

alter table test drop(a,B);

答案 11 :(得分: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;

答案 12 :(得分:0)

选择要删除的列:

MustGetenv()

但是,某些数据库(包括 SQLite )的支持有限,您可能必须创建一个新表并将数据迁移到以下位置:

https://www.sqlite.org/faq.html#q11

答案 13 :(得分:-7)

尝试以下查询:

alter table table_name add field_name data_type

alter table table_name drop column field_name

alter table table_name drop field_name