【问题标题】:How to DROP multiple columns with a single ALTER TABLE statement in SQL Server?如何在 SQL Server 中使用单个 ALTER TABLE 语句删除多个列?
【发布时间】:2011-09-14 19:47:00
【问题描述】:

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

来自MSDN's ALTER TABLE documentation...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

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

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

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

【问题讨论】:

    标签: sql sql-server tsql alter


    【解决方案1】:

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

    【讨论】:

    • @Gweebz - 我认为您遇到的错误与列使用有关。列可用于约束、索引或其他计算列。
    • 准确地说;我在索引中使用的第二列。我删除了那个索引,之后我的 DROP 语句运行得很好。
    • @jeicam - 这可能是因为,您尝试删除的列中有 1 个可能是主键。
    【解决方案2】:

    总结

    Oracle:

    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

    【讨论】:

    • 对于 PostgreSQL,您甚至可以像在 MySql 中一样省略 COLUMN 关键字。
    • 您也可以对 MySQL 使用与 MS SQL 和 Postgre SQL 相同的格式:ALTER TABLE table_name DROP COLUMN column_name1, column_name2;
    【解决方案3】:
    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

    【讨论】:

    • +1 表示有关表格大小和需要重建的注释。您能否提供文档链接作为参考?
    • 我和我的 DBA 谈过关于进行 REBUILD 的事情,他说如果表有一个聚集索引(我的就是这样),我可以运行 ALTER INDEX PK_IndexName ON TableName REBUILD,它会回收空间。这在此处有所描述:msdn.microsoft.com/en-us/library/ms189858.aspx 在“重建索引”部分下。
    • 任何人都可以阐明为什么会这样实施?如果我删除列,我希望索引、数据和建立在该列上的所有内容都将消失。在没有警告的情况下浪费空间似乎是一种不好的做法,还是我错过了什么?
    【解决方案4】:

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

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

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

    【讨论】:

    • 这是不正确的语法。使用:ALTER TABLE 测试 DROP COLUMN c1, c2;
    • @Graeme 语法是正确的,我已经对其进行了测试并且它可以工作,如果我使用: ALTER TABLE Test DROP COLUMN c1, c2; Mysql 报错。 ...靠近 c2
    • @TomBikiNurse 这个问题有一个 MSDN 参考,因此假设有问题的 SQL 与 MS SQL Server 而不是 MySQL 相关
    • @SuryaPratap 这个问题在最后一段中确实提到了“我的 SQL”。
    • @Eternal21 你提到的参考是How should I write my SQL to drop multiple columns in one statement (if possible)? 句子的上下文表明“my”指的是作者,“SQL”指的是语言。
    【解决方案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;
    

    【讨论】:

      【解决方案6】:

      对于 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 &lt;col_name&gt;drop column &lt;col_name&gt; 的简写,从上面的 drop c3 可以看出。

      【讨论】:

        【解决方案7】:

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

        ALTER TABLE tablename DROP COLUMN column1;

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

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

        【讨论】:

          【解决方案8】:
          alter table tablename drop (column1, column2, column3......);
          

          【讨论】:

          • 这是不正确的语法。使用:ALTER TABLE 测试 DROP COLUMN c1, c2;
          【解决方案9】:

          通用:

          ALTER TABLE table_name 
          DROP COLUMN column1,column2,column3;
          

          例如:

          ALTER TABLE Student 
          DROP COLUMN Name, Number, City;
          

          【讨论】:

            【解决方案10】:

            对于 postgis 是

            alter table table01 drop columns col1, drop col2

            【讨论】:

            • 用sql试过了,但是不行。在日志中得到了这个:12:58:04 ALTER TABLE ORDERS DROP COLUMNS user_name, user_contact_number, user_address 错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行 0.0060 秒处的 'user_name, user_contact_number, user_address' 附近使用正确的语法
            【解决方案11】:

            这个查询将改变多列测试它。

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

            【讨论】:

            • 这是不正确的语法。使用:ALTER TABLE 测试 DROP COLUMN c1, c2;
            【解决方案12】:
            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;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-04-06
              • 2013-01-26
              • 2011-09-04
              • 1970-01-01
              • 1970-01-01
              • 2021-10-05
              相关资源
              最近更新 更多