ChatGPT解决这个技术问题 Extra ChatGPT

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

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

MSDN's ALTER TABLE documentation...

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

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

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


i
informatik01

对于 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 个可能是主键。
i
informatik01

总结

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;
R
Remus Rusanu
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 在“重建索引”部分下。
任何人都可以阐明为什么会这样实施?如果我删除列,我希望索引、数据和建立在该列上的所有内容都将消失。在没有警告的情况下浪费空间似乎是不好的做法,还是我错过了什么?
M
MANISH ZOPE

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

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”指的是语言。
M
Martin Brown

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;

P
Patrick Kostjens

对于 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 c3 可以看出,drop <col_name>drop column <col_name> 的简写。


B
Bhavesh G

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

ALTER TABLE tablename DROP COLUMN column1;

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

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


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

这是不正确的语法。用途:ALTER TABLE 测试 DROP COLUMN c1, c2;
C
Chiragkumar Thakar

通用的:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

例如:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;

J
Joselin Ceron

因为 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' 附近使用正确的语法
A
Alexis Pigeon

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

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

alter table test drop(a,B);

这是不正确的语法。用途:ALTER TABLE 测试 DROP COLUMN c1, c2;
f
fredmaggiowski
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;