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

Jes*_*ebb 269 sql t-sql sql-server alter

我想编写一个SQL命令来从一个ALTER TABLE语句中删除单个表中的多个列.

来自MSDN的ALTER TABLE文档 ......

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }
Run Code Online (Sandbox Code Playgroud)

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

它说mutliple列可以在语句中列出,但语法不显示可选的逗号或任何甚至暗示语法的东西.

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

Ale*_*Aza 398

对于SQL Server:

alter table TableName
    drop column Column1, Column2
Run Code Online (Sandbox Code Playgroud)

语法是

DROP { [ CONSTRAINT ] constraint_name | COLUMN column } [ ,...n ] 
Run Code Online (Sandbox Code Playgroud)

对于MySQL:

alter table TableName
    drop Column1, drop Column2
Run Code Online (Sandbox Code Playgroud)


dir*_*dir 187

总结

甲骨文:

ALTER TABLE table_name DROP (column_name1, column_name2);
Run Code Online (Sandbox Code Playgroud)

MS SQL:

ALTER TABLE table_name DROP COLUMN column_name1, column_name2
Run Code Online (Sandbox Code Playgroud)

MySql:

ALTER TABLE table_name DROP column_name1, DROP column_name2;
Run Code Online (Sandbox Code Playgroud)

Postgre SQL

ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2;
Run Code Online (Sandbox Code Playgroud)

意识到

DROP COLUMN不会为某些DBMS物理删除数据.例如,对于MS SQL.对于固定长度类型(int,numeric,float,datetime,uniqueidentifier等),即使对于删除列后添加的记录,也会占用空间.为了摆脱浪费的空间,请做ALTER TABLE ... REBUILD.

  • 对于 PostgreSQL,您甚至可以像在 MySql 中一样省略 `COLUMN` 关键字。 (3认同)

Rem*_*anu 39

create table test (a int, b int , c int, d int);
alter table test drop column b, d;
Run Code Online (Sandbox Code Playgroud)

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

  • 关于表格大小并需要REBUILD的注释+1.您可以提供文档链接作为参考吗? (11认同)
  • 我和我的DBA谈过做一个REBUILD,他说如果表有一个聚集索引(我的那个),我可以运行`ALTER INDEX PK_IndexName ON TableName REBUILD`,它会收回空间.这里有一点描述:http://msdn.microsoft.com/en-us/library/ms189858.aspx在"重建索引"部分. (4认同)
  • 在ALTER TABLE中:http://msdn.microsoft.com/en-us/library/ms190273.aspx (2认同)

MAN*_*OPE 12

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

alter table tablename drop column col1, drop column col2 , drop column col3 ....
Run Code Online (Sandbox Code Playgroud)

因此,对于每个列,您需要在Mysql 5.0.45中指定"drop column".

  • @TomBikiNurse这个问题有一个MSDN参考,因此假设有问题的SQL与MS SQL Server有关,而不是MySQL (6认同)

Mar*_*own 5

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

 DROP 
 {
     [ CONSTRAINT ] 
     { 
          constraint_name 
          [ WITH 
           ( <drop_clustered_constraint_option> [ ,...n ] ) 
          ] 
      } [ ,...n ]
      | COLUMN 
      {
          column_name 
      } [ ,...n ]
 } [ ,...n ]
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3
Run Code Online (Sandbox Code Playgroud)

或这个

ALTER TABLE TableName
    DROP 
        COLUMN Column1,
        COLUMN Column2,
        COLUMN Column3
Run Code Online (Sandbox Code Playgroud)

如果您想将删除列与删除约束结合起来,则第二种语法很有用:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE Test
    REBUILD;
Run Code Online (Sandbox Code Playgroud)