Dalam SQL, jika Anda ingin menghapus tabel dari database, Anda perlu menggunakan DROP TABLE
pernyataan.
Itu menghancurkan tabel dan semua datanya.
Sintaks
Sintaks standar SQL seperti ini:
DROP TABLE <table name> <drop behavior>
Dimana:
<table name>
adalah nama tabel yang ingin Anda jatuhkan.<drop behavior>
menentukan opsi apa pun. Ini bisa berupaCASCADE
atauRESTRICT
.
Beberapa RDBMS juga menerima IF EXISTS
opsional argumen yang berarti tidak akan mengembalikan kesalahan jika tabel tidak ada.
Beberapa RDBMS (seperti MySQL dan MariaDB) juga menerima TEMPORARY
opsional kata kunci untuk memastikan hanya tabel sementara yang dihapus.
Oracle juga menerima PURGE
klausa, yang membersihkannya dari recycle bin.
Contoh
Berikut ini contoh untuk didemonstrasikan.
DROP TABLE t1;
Menjalankan kode itu menjatuhkan tabel yang disebut t1
dan semua datanya.
IF EXISTS
Klausa
Berikut ini contoh penggunaan IF EXISTS
klausa untuk memeriksa apakah tabel sudah ada.
DROP TABLE IF EXISTS t1;
Menggunakan IF EXISTS
memastikan bahwa kami tidak mendapatkan kesalahan jika tabel tidak ada.
Inilah yang terjadi jika kita menghapus IF EXISTS
dari pernyataan:
DROP TABLE t1;
Hasil:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
Itulah pesan yang dikembalikan oleh SQL Server. Pesan Anda akan bergantung pada DBMS yang Anda gunakan.
Kunci &Tampilan Asing Bergantung
Beberapa RDBMS mengizinkan RESTRICT
opsional atau CASCADE
kata kunci yang menentukan apa yang terjadi jika tabel memiliki kunci asing atau tampilan yang merujuknya.
RESTRICT
Opsi
Berikut ini contoh penggunaan RESTRICT
ketika mencoba untuk menjatuhkan tabel yang direferensikan oleh kunci asing di tabel lain:
DROP TABLE t1 RESTRICT;
Hasil:
cannot drop table t1 because other objects depend on it
Contoh ini dilakukan dengan menggunakan PostgreSQL. RESTRICT
adalah opsi default, jadi kami akan menerima hasil yang sama meskipun kami tidak menyertakan RESTRICT
kata kunci.
CASCADE
Opsi
Inilah yang terjadi jika kita beralih ke CASCADE
ketika mencoba menjatuhkan tabel yang sama (yang dirujuk oleh kunci asing di tabel lain):
DROP TABLE t1 CASCADE;
Hasil:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Ini menjatuhkan kunci asing yang mereferensikan t1
kami meja. Kunci asing disebut t2_c2_fkey
.
Perhatikan bahwa itu tidak menjatuhkan tabel yang memiliki kunci asing. Itu hanya menjatuhkan kunci asing.
Jika tabel target (t1
) direferensikan oleh tampilan apa pun, seluruh tampilan akan dihapus.
Anda tidak perlu menentukan CASCADE
untuk menjatuhkan indeks, aturan, pemicu, atau batasan apa pun yang ada untuk tabel target. Ini dihapus secara otomatis, bahkan saat menggunakan opsi default (RESTRICT
).
MySQL dan MariaDB
Beberapa DBMS (seperti MySQL dan MariaDB) menerima RESTRICT
dan CASCADE
kata kunci, tetapi mereka tidak melakukan apa-apa. Mereka disediakan hanya untuk memudahkan portabilitas antar DBMS.
Oracle
Oracle memiliki sintaks yang sedikit berbeda, CASCADE CONSTRAINTS
, yang menghapus semua batasan integritas referensial yang merujuk ke kunci utama dan unik di tabel yang dijatuhkan.
SQL Server
SQL Server tidak mendukung CASCADE
atau RESTRICT
kata kunci. Jika tabel memiliki dependensi kunci asing, Anda harus menghapusnya sebelum menjatuhkan tabel, jika tidak, Anda akan mendapatkan kesalahan.
Namun, di SQL Server, Anda dapat menjatuhkan tabel meskipun direferensikan oleh tampilan atau prosedur tersimpan. Oleh karena itu, Anda harus memeriksa referensi semacam itu, dan secara eksplisit menghapusnya dengan menggunakan DROP VIEW
atau DROP PROCEDURE
.
SQLite
SQLite tidak mendukung CASCADE
atau RESTRICT
kata kunci.
Jika tabel target direferensikan oleh tampilan apa pun, tabel akan tetap dihapus (dan tampilan akan tetap ada).
Jika tabel target direferensikan oleh kunci asing apa pun, hasilnya akan bergantung pada apakah Anda mengaktifkan kunci asing, dan jika demikian, apakah ada data di tabel anak, dan jika demikian, apakah kunci asing didefinisikan dengan ON DELETE CASCADE
.
Jika Anda menggunakan SQLite, lihat SQLite DROP TABLE
untuk contoh dan diskusi menjatuhkan tabel yang direferensikan oleh kunci asing.
Lepaskan Beberapa Tabel
Beberapa RDBMS memungkinkan Anda untuk menghapus beberapa tabel dari satu DROP TABLE
pernyataan.
Contoh:
DROP TABLE t11, t12;
RDBMS yang mendukung sintaks ini termasuk SQL Server, MySQL, MariaDB, dan PostgreSQL.
Namun, jika Anda menjatuhkan tabel yang direferensikan oleh kunci asing, dan kunci asing tersebut mencegahnya agar tidak dijatuhkan, Anda harus mencantumkan tabel anak sebelum tabel induk.
Misalnya, jika saya menjalankan pernyataan di atas di SQL Server, saya mendapatkan kesalahan berikut:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
Dalam hal ini, saya cukup mengganti urutan tabel di DROP TABLE
pernyataan:
DROP TABLE t12, t11;
Sebenarnya, dalam kasus ini, saya mendapatkan kesalahan lain yang memberi tahu saya bahwa t12
tidak ada.
Inilah yang saya dapatkan:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Ini karena, meskipun pernyataan sebelumnya tidak dapat menjatuhkan t11
, ternyata berhasil menjatuhkan t12
.
Dan seperti komedi kesalahan, kali ini mampu menjatuhkan t11
tapi bukan t12
.
Terlepas dari itu, kedua tabel sekarang telah dihapus.
Tetapi jika Anda mendapatkan pesanan yang benar pertama kali, Anda akan menerima pesan seperti ini:
Commands completed successfully.
Kata Kunci SEMENTARA
Beberapa RDBMS (seperti MySQL dan MariaDB) menerima TEMPORARY
kata kunci.
Itu berada di antara DROP
dan TABLE
, seperti ini:
DROP TEMPORARY TABLE t1;
Menggunakan TEMPORARY
kata kunci akan memastikan bahwa Anda tidak secara tidak sengaja menjatuhkan tabel non-sementara saat mencoba menjatuhkan tabel sementara.
TEMPORARY
kata kunci memiliki efek berikut:
- Pernyataan hanya turun
TEMPORARY
tabel. - Pernyataan tidak menyebabkan komit implisit (menggunakan
DROP TABLE
tanpaTEMPORARY
kata kunci secara otomatis melakukan transaksi aktif saat ini). - Tidak ada hak akses yang diperiksa. Sebuah
TEMPORARY
tabel hanya terlihat dengan sesi yang membuatnya, jadi tidak diperlukan pemeriksaan.
Klausul Pembersihan
Oracle memiliki opsi PURGE
klausa, yang dapat Anda gunakan jika Anda ingin menghapus tabel dan melepaskan ruang yang terkait dengannya dalam satu langkah. Jika Anda menentukan PURGE
, maka database tidak menempatkan tabel dan objek dependennya ke dalam recycle bin.
Ini sama dengan menjatuhkan tabel terlebih dahulu lalu membersihkannya dari recycle bin, tetapi ini memungkinkan Anda menghemat satu langkah dalam prosesnya.
Perhatikan bahwa jika Anda menentukan PURGE
, Anda tidak akan dapat memulihkan tabel.
Jika Anda tidak menentukan PURGE
, DROP
TABLE
pernyataan tidak menghasilkan ruang yang dilepaskan kembali ke tablespace untuk digunakan oleh objek lain, dan ruang terus dihitung terhadap kuota ruang pengguna.