Làm cách nào để DROP nhiều cột với một câu lệnh ALTER TABLE duy nhất trong SQL Server?


292

Tôi muốn viết một lệnh SQL để thả nhiều cột từ một bảng trong một ALTER TABLEcâu lệnh.

Từ tài liệu ALTER TABLE của MSDN ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Chỉ định ràng buộc ràng buộc hoặc tên_bảng được xóa khỏi bảng. DROP COLUMN không được phép nếu mức độ tương thích là 65 hoặc sớm hơn. Nhiều cột và các ràng buộc có thể được liệt kê.

Nó nói rằng các cột mutlipl có thể được liệt kê trong câu lệnh nhưng cú pháp không hiển thị dấu phẩy tùy chọn hoặc bất cứ điều gì thậm chí có thể gợi ý cú pháp.

Làm cách nào để viết SQL của tôi để thả nhiều cột trong một câu lệnh (nếu có thể)?

Câu trả lời:


431

Đối với máy chủ SQL:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

Cú pháp là

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

Đối với MySQL:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

hoặc như thế này 1 :

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1 Từ COLUMNnày là tùy chọn và có thể được bỏ qua, ngoại trừ RENAME COLUMN(để phân biệt thao tác đổi tên cột với thao tác đổi tên RENAMEbảng). Thêm thông tin ở đây .


1
@Gweebz - Tôi cho rằng lỗi mà bạn có liên quan đến việc sử dụng cột. Cột có thể được sử dụng trong một ràng buộc, chỉ mục hoặc cột được tính toán khác.
Alex Aza

Đúng; cột thứ hai tôi đã được sử dụng trong Chỉ mục. Tôi đã bỏ Index đó và câu lệnh DROP của tôi hoạt động hoàn hảo sau đó.
Jesse Webb

@jeicam - Điều đó có thể đã xảy ra bởi vì, 1 trong số các cột bạn đang cố gắng thả có thể là khóa chính.
Benny

196

Tóm tắt

Oracle :

ALTER TABLE table_name DROP (column_name1, column_name2);

Máy chủ MS 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;

Hãy nhận biết

DROP COLUMNkhông loại bỏ vật lý dữ liệu cho một số DBMS. Ví dụ: đối với MS SQL. Đối với các loại độ dài cố định ( int , số , float , datetime , uniqueidentifier , v.v.), không gian được sử dụng ngay cả đối với các bản ghi được thêm sau khi các cột bị loại bỏ. Để thoát khỏi không gian lãng phí làm ALTER TABLE ... REBUILD.


3
Đối với PostgreSQL, bạn thậm chí có thể bỏ qua COLUMNtừ khóa như trong MySql.
Artem Novikov

1
Bạn cũng có thể sử dụng định dạng tương tự cho MySQL như đối với MS SQL và Postgre SQL: ALTER TABLE table_name DROP COLUMN cột_name1, cột_name2;
jciloa

Cảm ơn bạn đã mở rộng câu trả lời cho các nhà cung cấp DB khác!
KJP

39
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

Xin lưu ý rằng DROP COLUMN không xóa dữ liệu một cách vật lý và đối với các loại độ dài cố định (int, số, float, datetime, uniqueidentifier, v.v.), không gian được sử dụng ngay cả đối với các bản ghi được thêm sau khi các cột bị hủy. Để thoát khỏi không gian lãng phí làm ALTER TABLE ... REBUILD.


11
+1 cho ghi chú về kích thước bảng và yêu cầu REBUILD. Bạn có thể cung cấp một liên kết đến tài liệu như một tài liệu tham khảo?
Jesse Webb


4
Tôi đã nói chuyện với DBA của tôi về việc thực hiện REBUILD và anh ta nói rằng nếu bảng có Index được nhóm (mà tôi đã làm), tôi có thể chạy ALTER INDEX PK_IndexName ON TableName REBUILDvà nó sẽ lấy lại khoảng trống. Điều này phần nào được mô tả ở đây: msdn.microsoft.com/en-us/l Library / ms189858.aspx trong phần "Xây dựng lại một chỉ mục".
Jesse Webb

1
Bất cứ ai cũng có thể làm sáng tỏ TẠI SAO điều này sẽ được thực hiện như vậy? Nếu tôi bỏ cột, tôi hy vọng các chỉ mục, dữ liệu và mọi thứ được xây dựng trên cột đó sẽ biến mất. Để lại không gian lãng phí mà không có nhiều cảnh báo có vẻ như thực hành tồi, hoặc tôi đang thiếu một cái gì đó?
DanteTheSmith

13

Điều này có thể là muộn, nhưng chia sẻ nó cho người dùng mới truy cập câu hỏi này. Để thả nhiều cột cú pháp thực tế là

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

Vì vậy, đối với mỗi cột, bạn cần chỉ định "cột thả" trong Mysql 5.0.45.


Đây là cú pháp không chính xác. Sử dụng: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme

1
@Graeme cú pháp là chính xác, tôi đã kiểm tra nó và nó hoạt động, nếu tôi sử dụng: ALTER TABLE Test DROP COLUMN c1, c2; Mysql ném một lỗi. ... gần c2
Tom Mwenda

6
@TomBikiNurse Câu hỏi có tham chiếu MSDN do đó người ta cho rằng SQL trong câu hỏi có liên quan đến MS SQL Server chứ không phải MySQL
Surya Pratap

đây là cú pháp thực tế các câu trả lời bình chọn tốt hơn là sai.
Vardumper

@SuryaPratap Câu hỏi có đề cập đến 'SQL của tôi' trong đoạn cuối.
Eternal21

4

Cú pháp theo quy định của Microsoft cho việc bỏ một phần cột của câu lệnh ALTER là đây

 DROP 
 {
     [ CONSTRAINT ] 
     { 
          constraint_name 
          [ WITH 
           ( <drop_clustered_constraint_option> [ ,...n ] ) 
          ] 
      } [ ,...n ]
      | COLUMN 
      {
          column_name 
      } [ ,...n ]
 } [ ,...n ]

Lưu ý rằng [, ... n] xuất hiện sau cả tên cột và ở cuối mệnh đề thả toàn bộ. Điều này có nghĩa là có hai cách để xóa nhiều cột. Bạn có thể làm điều này:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

hoặc cái này

ALTER TABLE TableName
    DROP 
        COLUMN Column1,
        COLUMN Column2,
        COLUMN Column3

Cú pháp thứ hai này rất hữu ích nếu bạn muốn kết hợp việc thả cột với việc bỏ ràng buộc:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Khi thả các cột, SQL Sever không lấy lại khoảng trống được lấy bởi các cột được thả. Đối với các loại dữ liệu được lưu trữ nội tuyến trong các hàng (ví dụ int), nó thậm chí có thể chiếm không gian trên các hàng mới được thêm vào sau câu lệnh thay đổi. Để giải quyết vấn đề này, bạn cần tạo một chỉ mục được nhóm trên bảng hoặc xây dựng lại chỉ mục được phân cụm nếu nó đã có một chỉ mục. Việc xây dựng lại chỉ mục có thể được thực hiện bằng lệnh REBUILD sau khi sửa đổi bảng. Nhưng được cảnh báo điều này có thể chậm trên các bảng rất lớn. Ví dụ:

ALTER TABLE Test
    REBUILD;

3

Đối với MySQL (ver 5.6), bạn không thể thực hiện nhiều lần thả cột với một lần dropthay vì một lần thay vì nhiều lần 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> 

BTW, drop <col_name>được viết tắt drop column <col_name>như bạn có thể thấy từ drop c3trên cao.


2

Nếu nó chỉ là một cột duy nhất để xóa cú pháp dưới đây hoạt động

ALTER TABLE tablename DROP COLUMN column1;

Để xóa nhiều cột, sử dụng công cụ DROP COLUMNdoesnot, cú pháp dưới đây hoạt động

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


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

Đây là cú pháp không chính xác. Sử dụng: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme

1

Chung:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Ví dụ:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;

0

truy vấn này sẽ thay đổi nhiều cột kiểm tra nó.

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

alter table test drop(a,B);

Đây là cú pháp không chính xác. Sử dụng: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme

0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

cho MySQL DB.

Hoặc bạn có thể thêm một số cột trong khi thay đổi trong cùng một dòng:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.