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 KEYkendala. - Terkait dengan default yang ditentukan dengan
DEFAULTkata 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