Dalam SQL, jika Anda ingin menghapus kolom dari tabel, Anda perlu menggunakan ALTER TABLE
pernyataan dengan DROP COLUMN
klausa.
Itu menghapus kolom dan semua datanya.
Sintaks
Sintaksnya seperti ini:
ALTER TABLE table_name
DROP COLUMN column_name;
Beberapa RDBMS menerima IF EXISTS
opsional argumen yang berarti tidak akan mengembalikan kesalahan jika kolom tidak ada.
Beberapa RDBMS juga menerima CASCADE
opsional dan RESTRICT
argumen, yang menentukan apa yang harus dilakukan jika kolom memiliki dependensi. Lihat di bawah untuk lebih lanjut tentang ini.
Contoh
Berikut ini contoh untuk didemonstrasikan.
ALTER TABLE Products
DROP COLUMN ProductDescription;
Ini menghapus ProductDescription
kolom dari Products
tabel.
IF EXISTS
Argumen
Tergantung pada RDBMS Anda, Anda mungkin dapat menggunakan IF EXISTS
argumen, yang secara kondisional menjatuhkan kolom hanya jika sudah ada.
Manfaat melakukan ini adalah Anda tidak akan mendapatkan kesalahan jika kolom tidak ada.
Contoh:
ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;
Batasi Perubahan
Tergantung pada RDBMS Anda, Anda mungkin dapat menggunakan CASCADE
dan RESTRICT
argumen untuk menentukan apa yang harus dilakukan jika kolom memiliki dependensi, seperti kunci atau tampilan asing.
RESTRICT
biasanya merupakan perilaku default, jadi jika Anda tidak menentukan argumen ini, DBMS akan menolak untuk menghapus kolom jika ada objek dependen.
Contoh:
ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;
Saat menggunakan pernyataan di atas, jika kolom memiliki dependensi, operasi drop akan gagal, dan Anda akan mendapatkan kesalahan.
Inilah kesalahan yang saya dapatkan di PostgreSQL ketika mencoba menjatuhkan tabel yang direferensikan oleh tampilan:
cannot drop column productdescription of table products because other objects depend on it
Meneruskan Perubahan
Menggunakan CASCADE
opsi akan menyebabkan objek dependen apa pun dijatuhkan.
Inilah yang terjadi jika saya mengubah contoh sebelumnya menjadi CASCADE
:
ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;
Hasil:
NOTICE: drop cascades to view vproducts Commands completed successfully
Dalam hal ini, kolom dijatuhkan dan saya mendapat pesan yang menjelaskan bahwa tampilan tersebut bernama vproducts
juga dijatuhkan.
CASCADE
dan RESTRICT
didukung di PostgreSQL, tetapi tidak di SQL Server atau MySQL. Kedua kata kunci tersebut dapat digunakan di MariaDB tetapi tidak memiliki efek apa pun.
Oracle menerima CASCADE CONSTRAINTS
klausa yang menghapus semua batasan kunci asing yang merujuk ke kunci utama dan unik yang ditentukan pada kolom yang dijatuhkan serta semua batasan multikolom yang ditentukan pada kolom yang dijatuhkan.
Lepaskan Beberapa Kolom
Beberapa RDBM memungkinkan Anda untuk menjatuhkan beberapa kolom dalam satu ALTER TABLE
penyataan. Sintaksnya bervariasi antar RDBMS.
Di SQL Server, Anda cukup membuat daftar setiap kolom, dipisahkan dengan koma:
ALTER TABLE t1
DROP COLUMN c1, c2;
Di RDBMS lain (seperti MySQL dan PostgreSQL), Anda perlu menulis ulang DROP COLUMN
untuk setiap kolom:
ALTER TABLE t1
DROP COLUMN c1, DROP COLUMN c2;
Perhatikan bahwa sintaks ini adalah ekstensi ke SQL, dan tidak sesuai dengan standar SQL yang hanya memiliki satu DROP
klausa per ALTER TABLE
pernyataan.
Lepaskan Kolom Terakhir
Beberapa RDBM memungkinkan Anda untuk menjatuhkan kolom terakhir dalam tabel, sehingga meninggalkan tabel kosong tanpa kolom. Ini adalah perpanjangan dari standar SQL (yang tidak mengizinkan tabel kolom nol).
Misalnya, di PostgreSQL, saya menggunakan pernyataan berikut untuk menghapus kolom terakhir yang tersisa di tabel
ALTER TABLE t1
DROP COLUMN c3;
Hasil:
Commands completed successfully
Tetapi di SQL Server, jika saya melakukan hal yang sama:
ALTER TABLE t1
DROP COLUMN c1, c2, c3;
Hasil:
Msg 4923, Level 16, State 1, Line 1 ALTER TABLE DROP COLUMN failed because 'c3' is the only data column in table 't1'. A table must have at least one data column.
Perhatikan bahwa terlepas dari kata-kata dari pesan kesalahan ini, c3 bukan satu-satunya kolom yang tersisa. Sebenarnya ada tiga kolom. Namun, c3 akan menjadi yang terakhir yang tersisa jika dua lainnya dijatuhkan. Dalam hal ini, tidak satu pun dari tiga kolom yang benar-benar dijatuhkan.
Either way, bahkan jika saya menjatuhkan dua lainnya, SQL Server akan menolak untuk menjatuhkan yang terakhir.
MySQL juga menolak untuk menjatuhkan kolom terakhir dalam sebuah tabel.
Jika niat Anda adalah untuk menjatuhkan meja, gunakan DROP TABLE
.
Pembatasan oleh RDBMS
Meskipun DROP COLUMN
dasar sintaksnya cukup mirip di sebagian besar RDBMS utama, setiap RDBMS cenderung memiliki batasannya sendiri untuk kapan kolom akan atau tidak akan dijatuhkan.
Berikut adalah beberapa batasan dari beberapa RDBMS utama.
SQL Server
Kolom tidak dapat dihapus jika:
- Digunakan dalam indeks, baik sebagai kolom kunci atau sebagai
INCLUDE
- Digunakan dalam
CHECK
,FOREIGN KEY
,UNIQUE
, atauPRIMARY KEY
kendala. - Terkait dengan default yang ditentukan dengan
DEFAULT
kata kunci, atau terikat ke objek default. - Terikat pada aturan.
Sumber untuk SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
MySQL
Jika kolom dikeluarkan dari tabel, kolom juga dihapus dari indeks mana pun yang menjadi bagiannya. Jika semua kolom yang membentuk indeks dihapus, indeks juga akan dihapus.
Sumber untuk MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
PostgreSQL
Indeks dan batasan tabel yang melibatkan kolom juga akan dihapus secara otomatis.
Statistik multivarian yang mereferensikan kolom yang dihapus juga akan dihapus jika penghapusan kolom akan menyebabkan statistik hanya berisi data untuk satu kolom.
Anda harus menggunakan CASCADE
jika sesuatu di luar tabel bergantung pada kolom, misalnya, kunci asing atau tampilan.
Sumber untuk PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html
SQLite
SQLite tidak mendukung DROP COLUMN
sintaksis. Anda tidak dapat menjatuhkan kolom di SQLite.
Jika Anda perlu melepaskan kolom di SQLite, sebaiknya ikuti proses 12 langkah yang direkomendasikan dalam dokumentasi SQLite.
Sumber untuk SQLite:https://sqlite.org/lang_altertable.html#otheralter
MariaDB
Jika kolom adalah bagian dari indeks apa pun, kolom tersebut akan dihapus dari indeks tersebut, kecuali jika Anda menambahkan kolom baru dengan nama yang sama pada saat yang bersamaan. Indeks akan dijatuhkan jika semua kolom dari indeks dijatuhkan. Jika kolom digunakan dalam tampilan atau pemicu, Anda akan mendapatkan kesalahan saat tampilan atau pemicu diakses lagi.
Dari MariaDB 10.2.8, menjatuhkan kolom yang merupakan bagian dari UNIQUE
multi-kolom batasan tidak diizinkan.
MariaDB menerima RESTRICT
dan CASCADE
untuk membuat porting dari sistem database lain lebih mudah, tetapi di MariaDB, mereka tidak melakukan apa-apa.
MariaDB 10.4.0 mendukung DROP COLUMN
instant . DROP COLUMN
dari kolom yang diindeks akan menyiratkan DROP INDEX
(dan dalam kasus non-UNIQUE
indeks multi-kolom, mungkin ADD INDEX
). Ini tidak akan diizinkan dengan ALGORITHM=INSTANT
, tetapi tidak seperti sebelumnya, mereka dapat diizinkan dengan ALGORITHM=NOCOPY
.
Sumber untuk MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column