Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

SQL DROP COLUMN untuk Pemula

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 , atau PRIMARY 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Peningkatan Dukungan untuk Rebuild Statistik Paralel

  2. Dampak kinerja dari berbagai teknik penanganan kesalahan

  3. 7 Hal Utama yang Perlu Diingat Tentang Globalisasi Model Data

  4. Cara Mendapatkan Catatan dari 30 Hari Terakhir

  5. Menghubungkan ke Database menggunakan PHP