簡體   English   中英

如何在 SQL 服務器中使用單個 ALTER TABLE 語句刪除多個列?

[英]How to DROP multiple columns with a single ALTER TABLE statement in SQL Server?

我想編寫一個 SQL 命令以在一個ALTER TABLE語句中從單個表中刪除多個列。

來自MSDN 的 ALTER TABLE 文檔...

 DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

指定從表中刪除 constraint_name 或 column_name。 如果兼容級別為 65 或更早,則不允許使用 DROP COLUMN。 可以列出多個列和約束。

它說可以在語句中列出多個列,但語法不顯示可選的逗號或任何甚至會暗示語法的內容。

我應該如何編寫我的 SQL 以在一個語句中刪除多個列(如果可能)?

對於 SQL 服務器:

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

總結

Oracle :

ALTER TABLE table_name DROP (column_name1, column_name2);

女士 SQL 服務器

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

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

這可能會遲到,但會為訪問此問題的新用戶分享。 刪除多列的實際語法是

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

因此,對於每一列,您需要在 Mysql 5.0.45 中指定“刪除列”。

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 服務器不回收刪除的列占用的空間。 對於行內存儲的數據類型(例如 int),它甚至可能占用 alter 語句后添加的新行的空間。 要解決這個問題,您需要在表上創建一個聚集索引,或者重建聚集索引(如果已有)。 可以在修改表后使用 REBUILD 命令重建索引。 但請注意,這在非常大的桌子上可能會很慢。 例如:

ALTER TABLE Test
    REBUILD;

對於 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中看到的那樣。

如果只是單列刪除以下語法有效

ALTER TABLE tablename DROP COLUMN column1;

對於刪除多列,使用DROP COLUMN不起作用,下面的語法有效

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

通用的:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

例如:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;
alter table tablename drop (column1, column2, column3......);

對於 postgis 是

alter table table01 drop columns col1, drop col2

此查詢將更改多列測試它。

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

alter table test drop(a,B);
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;

我想編寫一個 SQL 命令以在一個ALTER TABLE語句中從單個表中刪除多個列。

MSDN 的 ALTER TABLE 文檔...

 DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

指定從表中刪除 constraint_name 或 column_name。 如果兼容級別為 65 或更早,則不允許使用 DROP COLUMN。 可以列出多個列和約束。

它說可以在語句中列出多個列,但語法不顯示可選的逗號或任何甚至暗示語法的內容。

我應該如何編寫 SQL 以在一個語句中刪除多個列(如果可能)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM