Di SQLite, Anda dapat menjatuhkan tabel dengan DROP TABLE
pernyataan.
Anda dapat secara opsional menambahkan IF EXISTS
klausa untuk menekan kesalahan yang mungkin terjadi jika tabel tidak ada.
Juga, jika tabel direferensikan oleh kunci asing, ada beberapa hal yang harus diperhatikan.
Contoh
Berikut adalah contoh untuk mendemonstrasikan cara paling sederhana untuk menjatuhkan tabel di SQLite:
DROP TABLE t1;
Ini menjatuhkan tabel yang disebut t1
.
Anda dapat secara opsional mengawali nama tabel dengan nama skema.
Menggunakan IF EXISTS
Klausa
Anda dapat menggunakan IF EXISTS
klausa untuk menekan kesalahan yang mungkin terjadi jika tabel tidak ada.
DROP TABLE IF EXISTS t2;
Jika kami menghapus IF EXISTS
klausa, dan jalankan lagi, kita mendapatkan kesalahan.
Contoh:
DROP TABLE t2;
Hasil:
Error: no such table: t2
Ketergantungan Kunci Asing &Tampilan
SQLite tidak mendukung CASCADE
dan RESTRICT
kata kunci, yang disertakan dalam standar SQL, dan didukung oleh beberapa RDBMS lain (seperti PostgreSQL). Kata kunci ini dirancang untuk menentukan apa yang harus dilakukan ketika tabel target memiliki dependensi (seperti tampilan atau kunci asing yang mereferensikan tabel).
Mengingat SQLite tidak mendukung kata kunci ini, berikut ini cara SQLite menangani tampilan dan kunci asing saat Anda mencoba menghapus tabel.
SQLite mengabaikan tampilan dependen apa pun. Dengan kata lain, itu terus berlanjut dan menjatuhkan tabel, bahkan jika ada pandangan yang merujuknya.
Adapun kunci asing…
Pertama, kunci asing dinonaktifkan secara default di SQLite. Jadi, kecuali Anda mengaktifkannya, kunci asing apa pun yang mereferensikan tabel target tidak akan berdampak pada penurunan tabel target. Dengan kata lain, tabel akan dijatuhkan.
Jika kunci asing diaktifkan di sesi Anda, maka mereka hanya akan mencegah menjatuhkan tabel jika ada data yang akan melanggar kunci asing itu. Jika tabel anak Anda tidak berisi data, maka tabel induk akan dihapus tanpa kesalahan. Jika tabel anak berisi data (mungkin termasuk data yang mereferensikan kunci utama tabel induk), maka ini akan menghasilkan kesalahan dan tabel tidak akan dihapus.
Seperti ini:
PRAGMA foreign_keys = ON;
DROP TABLE t1;
Hasil:
Error: FOREIGN KEY constraint failed
Alasan ia bekerja seperti ini adalah karena SQLite melakukan DELETE FROM
implicit implisit operasi sebelum menjatuhkan meja. Jika DELETE FROM
operasi menghasilkan pelanggaran kunci asing, maka kami mendapatkan kesalahan. Tetapi jika tidak ada data dalam tabel, maka sembarang DELETE FROM
operasi tidak akan mengakibatkan pelanggaran kunci asing, dan tabel dapat dijatuhkan.
Singkatnya, ini bukan DROP TABLE
operasi yang menyebabkan pelanggaran kunci asing, itu adalah DELETE FROM
implicit implisit operasi.
Saat Kunci Asing menggunakan ON DELETE CASCADE
Namun, jika batasan kunci asing didefinisikan dengan ON DELETE CASCADE
, maka tabel induk akan dihapus, dan setiap baris yang mereferensikan kolom kunci utama tabel tersebut akan dihapus di tabel turunan.
Ini contohnya.
Buat tabel dan masukkan data:
CREATE TABLE t11 (
c1 integer PRIMARY KEY AUTOINCREMENT
);
CREATE TABLE t12 (
c1 integer PRIMARY KEY AUTOINCREMENT,
c2 integer REFERENCES t11 (c1) ON DELETE CASCADE
);
INSERT INTO t11 VALUES (1);
INSERT INTO t12 VALUES (1, 1);
Pilih data:
sqlite> SELECT * FROM t11;
c1
--
1
sqlite> SELECT * FROM t12;
c1 c2
-- --
1 1
Lepaskan tabel induk dan tinjau semua tabel:
sqlite> DROP TABLE t11;
sqlite> .tables
t12
Kita dapat melihat bahwa t11
tidak ada lagi, tapi t12
masih ada.
Periksa kunci asing di t12
:
sqlite> PRAGMA foreign_key_list(t12);
id seq table from to on_update on_delete match
-- --- ----- ---- -- --------- --------- -----
0 0 t11 c2 c1 NO ACTION CASCADE NONE
Ya, itu masih ada, dan kami dapat mengonfirmasi bahwa itu memiliki ON DELETE CASCADE
.
Pilih data dari t12
:
sqlite> SELECT * FROM t12;
sqlite>
Tidak ada baris yang dikembalikan. Ini karena ON DELETE CASCADE
opsi pada kunci asing memastikan bahwa baris telah dihapus ketika tabel induk (t11
) dijatuhkan (atau lebih tepatnya, ketika datanya dihapus melalui DELETE FROM
implisit operasi sebelum dijatuhkan).
Menjatuhkan Kunci Asing
SQLite sebenarnya tidak mendukung pelepasan kunci asing. Biasanya dalam SQL Anda menjatuhkan kunci asing dengan ALTER TABLE
pernyataan, tetapi ALTER TABLE
SQLite implementasi tidak memungkinkan untuk menjatuhkan batasan.
Ada cara untuk menghadapi situasi ini. Lihat Cara Menjatuhkan Kunci Asing di SQLite sebagai contoh.