Bagaimana DROP beberapa kolom dengan pernyataan ALTER TABLE tunggal di SQL Server?

292

Saya ingin menulis perintah SQL tunggal untuk menjatuhkan beberapa kolom dari satu tabel dalam satu ALTER TABLEpernyataan.

Dari dokumentasi ALTER TABLE MSDN ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Menentukan bahwa constraint_name atau column_name dihapus dari tabel. DROP COLUMN tidak diperbolehkan jika tingkat kompatibilitas 65 atau lebih awal. Beberapa kolom dan batasan dapat didaftar.

Dikatakan bahwa mutliple kolom dapat dicantumkan dalam pernyataan tetapi sintaksisnya tidak menunjukkan koma opsional atau apa pun yang bahkan akan mengisyaratkan sintaks.

Bagaimana saya harus menulis SQL untuk menjatuhkan beberapa kolom dalam satu pernyataan (jika mungkin)?

Jesse Webb
sumber

Jawaban:

431

Untuk SQL Server:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

Sintaksnya adalah

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

Untuk MySQL:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

atau seperti ini 1 :

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1 Kata COLUMNini opsional dan dapat dihilangkan, kecuali untuk RENAME COLUMN(untuk membedakan operasi penggantian nama kolom dari operasi penggantian nama RENAMEtabel). Info lebih lanjut di sini .

Alex Aza
sumber
1
@ Gweebz - Saya berasumsi bahwa kesalahan yang Anda miliki terkait dengan penggunaan kolom. Kolom dapat digunakan dalam batasan, indeks atau kolom terhitung lainnya.
Alex Aza
Tepat; kolom kedua yang saya miliki digunakan dalam Indeks. Saya menjatuhkan Index itu dan pernyataan DROP saya bekerja dengan sempurna setelah itu.
Jesse Webb
@jeicam - Itu mungkin terjadi karena, 1 kolom yang ingin Anda lepas mungkin merupakan kunci utama.
Benny
196

Meringkas

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;

Waspadalah

DROP COLUMNtidak secara fisik menghapus data untuk beberapa DBMS. Misalnya untuk MS SQL. Untuk jenis panjang tetap ( int , numerik , float , datetime , uniqueidentifier dll) ruang dikonsumsi bahkan untuk catatan yang ditambahkan setelah kolom dijatuhkan. Untuk menghilangkan ruang yang terbuang lakukan ALTER TABLE ... REBUILD.

Denis Rozhnev
sumber
3
Untuk PostgreSQL Anda bahkan dapat menghilangkan COLUMNkata kunci seperti di MySql.
Artem Novikov
1
Anda juga dapat menggunakan format yang sama untuk MySQL seperti untuk MS SQL dan Postgre SQL: ALTER TABLE table_name DROP COLUMN column_name1, column_name2;
jciloa
Terima kasih telah memperluas jawaban ke vendor DB lainnya!
KJP
39
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

Ketahuilah bahwa DROP COLUMN tidak menghapus data secara fisik, dan untuk tipe panjang tetap (int, numerik, float, datetime, uniqueidentifier, dll.) Ruang tersebut dikonsumsi bahkan untuk catatan yang ditambahkan setelah kolom dijatuhkan. Untuk menghilangkan ruang yang terbuang lakukan ALTER TABLE ... REBUILD.

Remus Rusanu
sumber
11
+1 untuk catatan tentang ukuran tabel dan membutuhkan REBUILD. Bisakah Anda memberikan tautan ke dokumentasi sebagai referensi?
Jesse Webb
2
Di sana, di ALTER TABLE: msdn.microsoft.com/en-us/library/ms190273.aspx
Remus Rusanu
4
Saya berbicara dengan DBA saya tentang melakukan REBUILD dan dia mengatakan bahwa jika tabel memiliki Indeks berkerumun (yang saya punya), saya hanya bisa berlari ALTER INDEX PK_IndexName ON TableName REBUILDdan itu akan merebut kembali ruang. Ini agak dijelaskan di sini: msdn.microsoft.com/en-us/library/ms189858.aspx di bawah bagian "Membangun Kembali Indeks".
Jesse Webb
1
Adakah yang bisa menjelaskan mengapa ini diterapkan seperti itu? Jika saya menjatuhkan kolom saya berharap indeks, data dan semua yang dibangun di kolom itu akan hilang. Meninggalkan ruang yang terbuang tanpa peringatan sepertinya merupakan praktik yang buruk, atau apakah saya kehilangan sesuatu?
DanteTheSmith
13

Ini mungkin terlambat, tetapi membagikannya untuk pengguna baru yang mengunjungi pertanyaan ini. Untuk menjatuhkan beberapa kolom, sintaks sebenarnya adalah

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

Jadi untuk setiap kolom Anda perlu menentukan "drop kolom" di Mysql 5.0.45.

BANYAK ZOPE
sumber
Ini adalah sintaks yang salah. Gunakan: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1
@ Grema sintaks sudah benar, saya telah mengujinya dan berfungsi, jika saya menggunakan: ALTER TABLE Test DROP COLUMN c1, c2; Mysql melempar kesalahan. ... dekat c2
Tom Mwenda
6
@ TomBikiNurse Pertanyaan memiliki referensi MSDN sehingga diasumsikan bahwa SQL yang dimaksud terkait dengan MS SQL Server dan bukan MySQL
Surya Pratap
ini adalah sintaks yang sebenarnya. jawaban yang lebih baik salah.
Vardumper
@ SuryaPratap Pertanyaannya tidak menyebutkan 'my SQL' di paragraf terakhir.
Eternal21
4

Sintaks seperti yang ditentukan oleh Microsoft untuk menjatuhkan bagian kolom dari pernyataan ALTER adalah ini

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

Perhatikan bahwa [, ... n] muncul setelah nama kolom dan di akhir seluruh klausa drop. Ini artinya ada dua cara untuk menghapus banyak kolom. Anda dapat melakukan ini:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

atau ini

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

Sintaks kedua ini berguna jika Anda ingin menggabungkan setetes kolom dengan menjatuhkan batasan:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Saat menjatuhkan kolom, SQL Sever tidak mendapatkan kembali ruang yang diambil oleh kolom yang dijatuhkan. Untuk tipe data yang disimpan inline di baris (int misalnya) itu bahkan dapat mengambil ruang pada baris baru yang ditambahkan setelah pernyataan alter. Untuk menyiasati ini, Anda perlu membuat indeks berkerumun di atas meja atau membangun kembali indeks berkerumun jika sudah memilikinya. Membangun kembali indeks dapat dilakukan dengan perintah REBUILD setelah memodifikasi tabel. Tapi berhati-hatilah, ini bisa lambat di meja yang sangat besar. Sebagai contoh:

ALTER TABLE Test
    REBUILD;
Martin Brown
sumber
3

Untuk MySQL (ver 5.6), Anda tidak dapat melakukan beberapa drop kolom dengan satu droppernyataan tunggal tetapi lebih dari satu droppernyataan:

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>singkatan untuk drop column <col_name>seperti yang Anda lihat dari drop c3atas.

CSY
sumber
2

Jika itu hanya satu kolom untuk menghapus sintaks di bawah ini berfungsi

ALTER TABLE tablename DROP COLUMN column1;

Untuk menghapus beberapa kolom, menggunakan DROP COLUMNtidak berfungsi, sintaks di bawah ini berfungsi

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

kk250040
sumber
1
alter table tablename drop (column1, column2, column3......);
Neelima
sumber
Ini adalah sintaks yang salah. Gunakan: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1

Umum:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Misalnya:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;
Chirag Thakar
sumber
0

kueri ini akan mengubah beberapa kolom mengujinya.

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

alter table test drop(a,B);
Ratan Nahak
sumber
Ini adalah sintaks yang salah. Gunakan: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

untuk MySQL DB.

Atau Anda dapat menambahkan beberapa kolom sambil mengubah di baris yang sama:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
naveen vaishnav
sumber