วิธีการ DROP หลายคอลัมน์ด้วยคำสั่ง ALTER TABLE เดียวใน SQL Server


292

ฉันต้องการเขียนคำสั่ง SQL เดี่ยวเพื่อวางหลายคอลัมน์จากตารางเดียวในALTER TABLEคำสั่งเดียว

จากเอกสาร ALTER TABLE ของ MSDN ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

ระบุว่า constraint_name หรือ column_name ถูกลบออกจากตาราง DROP COLUMN ไม่ได้รับอนุญาตหากระดับความเข้ากันได้คือ 65 หรือเร็วกว่านั้น สามารถแสดงหลายคอลัมน์และข้อ จำกัด ได้

มันบอกว่าคอลัมน์ mutliple สามารถแสดงรายการในคำสั่ง แต่ไวยากรณ์ไม่แสดงเครื่องหมายจุลภาคหรืออะไรก็ได้ที่จะบอกใบ้ถึงไวยากรณ์

ฉันจะเขียน SQL ของฉันเพื่อวางหลายคอลัมน์ในคำสั่งเดียวได้อย่างไร (ถ้าเป็นไปได้)

คำตอบ:


431

สำหรับ 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ตาราง) ข้อมูลเพิ่มเติมที่นี่


1
@Gweebz - ฉันคิดว่าข้อผิดพลาดที่คุณมีเกี่ยวข้องกับการใช้คอลัมน์ คอลัมน์สามารถใช้ในข้อ จำกัด ดัชนีหรือคอลัมน์จากการคำนวณอื่น
Alex Aza

แม่นยำ; คอลัมน์ที่สองที่ฉันเคยใช้ในดัชนี ฉันลบดัชนีนั้นและคำสั่ง DROP ของฉันทำงานได้อย่างสมบูรณ์หลังจากนั้น
Jesse Webb

@jeicam - อาจเกิดขึ้นเพราะอาจมีคอลัมน์ใดคอลัมน์หนึ่งที่คุณพยายามวางอาจเป็นคีย์หลัก
Benny

196

สรุป

ออราเคิล :

ALTER TABLE table_name DROP (column_name1, column_name2);

เซิร์ฟเวอร์ 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;

ระวัง

DROP COLUMNไม่ร่างกายลบข้อมูลสำหรับ DBMS บาง เช่นสำหรับ MS SQL สำหรับประเภทความยาวคงที่ ( int , ตัวเลข , ลอย , datetime , uniqueidentifierเป็นต้น) พื้นที่จะถูกใช้แม้จะมีการเพิ่มเร็กคอร์ดหลังจากที่คอลัมน์ถูกทิ้ง ALTER TABLE ... REBUILDเพื่อกำจัดของเสียพื้นที่ทำ


3
สำหรับ PostgreSQL คุณสามารถละเว้นCOLUMNคำหลักได้ใน MySql
Artem Novikov

1
คุณยังสามารถใช้รูปแบบเดียวกันสำหรับ MySQL สำหรับ MS SQL และ Postgre SQL: แก้ไขตาราง table_name DROP COLUMN column_name1, column_name2;
jciloa

ขอบคุณสำหรับการขยายคำตอบไปยังผู้ขายฐานข้อมูลอื่น ๆ !
KJP

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

โปรดทราบว่า DROP COLUMN ไม่ได้ลบข้อมูลทางกายภาพและสำหรับประเภทความยาวคงที่ (int, ตัวเลข, ลอย, วันที่, เอกลักษณ์และตัวระบุอื่น ๆ ) พื้นที่จะถูกใช้แม้จะมีการเพิ่มระเบียนหลังจากที่คอลัมน์ถูกทิ้ง ALTER TABLE ... REBUILDเพื่อกำจัดของเสียพื้นที่ทำ


11
+1 สำหรับบันทึกย่อเกี่ยวกับขนาดตารางและต้องการให้สร้างใหม่ คุณสามารถให้ลิงค์ไปยังเอกสารประกอบเพื่อเป็นข้อมูลอ้างอิงได้หรือไม่?
Jesse Webb

2
ที่นั่นในตาราง ALTER: msdn.microsoft.com/en-us/library/ms190273.aspx
Remus Rusanu

4
ฉันพูดคุยกับ DBA ของฉันเกี่ยวกับการสร้าง REBUILD และเขากล่าวว่าหากตารางมีดัชนีคลัสเตอร์ (ซึ่งฉันทำ) ฉันก็สามารถเรียกใช้ALTER INDEX PK_IndexName ON TableName REBUILDและมันจะเรียกคืนพื้นที่ นี่คือคำอธิบายที่นี่: msdn.microsoft.com/en-us/library/ms189858.aspxภายใต้ส่วน "การสร้างดัชนีใหม่"
Jesse Webb

1
ทุกคนสามารถทำให้เข้าใจได้ว่าทำไมสิ่งนี้ถึงได้รับการปฏิบัติเช่นนี้? หากฉันปล่อยคอลัมน์ฉันคาดว่าดัชนีข้อมูลและทุกอย่างที่สร้างขึ้นในคอลัมน์นั้นจะหายไป การทิ้งพื้นที่ว่างเปล่าโดยไม่มีการเตือนดูเหมือนเป็นการปฏิบัติที่ไม่ดีหรือฉันขาดอะไรไปบ้าง?
DanteTheSmith

13

อาจช้า แต่การแชร์ให้กับผู้ใช้ใหม่ที่เข้ามาที่คำถามนี้ หากต้องการวางหลายคอลัมน์ไวยากรณ์ที่แท้จริงคือ

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

ดังนั้นสำหรับทุกคอลัมน์คุณต้องระบุ "คอลัมน์ลดลง" ใน Mysql 5.0.45


นี่เป็นไวยากรณ์ที่ไม่ถูกต้อง ใช้: แก้ไขตารางทดสอบ DROP COLUMN c1, c2;
แกรม

1
@Graeme ไวยากรณ์ถูกต้องฉันได้ทดสอบและใช้งานได้ถ้าฉันใช้: ALTER Table Test DROP COLUMN c1, c2; Mysql ส่งข้อผิดพลาด ... ใกล้ c2
Tom Mwenda

6
@ TomBikiNurse คำถามนี้มีการอ้างอิง MSDN ดังนั้นจึงสันนิษฐานว่า SQL ที่เป็นปัญหาเกี่ยวข้องกับ MS SQL Server ไม่ใช่ MySQL
Surya Pratap

นี่คือไวยากรณ์จริง คำตอบที่โหวตดีกว่านั้นผิด
Vardumper

@SuryaPratap คำถามพูดถึง 'my SQL' ในย่อหน้าสุดท้าย
นิรันดร์ 21

4

ไวยากรณ์ตามที่ระบุโดย Microsoft สำหรับการปล่อยส่วนคอลัมน์ของคำสั่งALTERคือสิ่งนี้

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

โปรดสังเกตว่า [, ... n] ปรากฏขึ้นหลังจากทั้งชื่อคอลัมน์และตอนท้ายของส่วนคำสั่งการปล่อยทั้งหมด สิ่งนี้หมายความว่ามีสองวิธีในการลบหลายคอลัมน์ คุณสามารถทำได้:

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;

3

สำหรับ 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> 

BTW drop <col_name>นั้นย่อมาจากdrop column <col_name>ที่คุณเห็นจากdrop c3ด้านบน


2

หากเป็นเพียงคอลัมน์เดียวที่จะลบไวยากรณ์ด้านล่างใช้งานได้

ALTER TABLE tablename DROP COLUMN column1;

สำหรับการลบหลายคอลัมน์โดยใช้การDROP COLUMNไม่ทำงานไวยากรณ์ด้านล่างใช้งานได้

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


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

นี่เป็นไวยากรณ์ที่ไม่ถูกต้อง ใช้: แก้ไขตารางทดสอบ DROP COLUMN c1, c2;
แกรม


0

แบบสอบถามนี้จะเปลี่ยนการทดสอบหลายคอลัมน์

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

alter table test drop(a,B);

นี่เป็นไวยากรณ์ที่ไม่ถูกต้อง ใช้: แก้ไขตารางทดสอบ DROP COLUMN c1, c2;
แกรม

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

สำหรับ MySQL DB

หรือคุณสามารถเพิ่มบางคอลัมน์ในขณะที่แก้ไขในบรรทัดเดียวกัน:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.