Biasanya jika Anda perlu menjatuhkan kunci asing di SQL, Anda akan menggunakan ALTER TABLE
penyataan. Tetapi jika Anda menggunakan SQLite, itu bukan pilihan.
SQLite mendukung subset yang sangat terbatas dari ALTER TABLE
penyataan. Satu-satunya hal yang dapat Anda lakukan dengan ALTER TABLE
di SQLite adalah mengganti nama tabel, mengganti nama kolom di dalam tabel, atau menambahkan kolom baru ke tabel yang sudah ada.
Dengan kata lain, Anda tidak dapat menggunakan ALTER TABLE
untuk menjatuhkan kunci asing seperti yang Anda bisa di RDBMS lain
Cara yang disarankan untuk "menjatuhkan" kunci asing di SQLite sebenarnya adalah dengan mentransfer data ke tabel baru tanpa kunci asing (atau dengan kunci asing yang berbeda, jika itu yang Anda perlukan).
Cara yang Disarankan
Dokumentasi SQLite merekomendasikan proses 12 langkah untuk membuat perubahan skema ke tabel. Kami akan menggunakan proses itu untuk "menjatuhkan" kunci asing dalam contoh berikut.
Membuat Tabel dengan Kunci Asing
Pertama, mari buat tabel dengan kunci asing dan isi dengan data.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
INSERT INTO Types VALUES
( NULL, 'Dog' ),
( NULL, 'Cat' ),
( NULL, 'Parakeet' ),
( NULL, 'Hamster' );
INSERT INTO Pets VALUES
( NULL, 'Brush', 3 ),
( NULL, 'Tweet', 3 ),
( NULL, 'Yelp', 1 ),
( NULL, 'Woofer', 1 ),
( NULL, 'Fluff', 2 );
Sebenarnya, di sini saya membuat dua tabel dan mengisinya dengan data. Dua tabel, karena yang pertama (Jenis ) memiliki kunci utama dan yang lainnya (Hewan peliharaan ) memiliki kunci asing. Kunci asing ditambahkan pada baris terakhir dari tabel kedua.
Kami dapat memverifikasi bahwa kunci asing telah dibuat dengan menjalankan perintah berikut:
PRAGMA foreign_key_list(Pets);
Hasil:
id seq table from to on_update on_delete match -- --- ----- ------ ------ --------- --------- ----- 0 0 Types TypeId TypeId NO ACTION NO ACTION NONE
Kita dapat melihat detail batasan kunci asing.
Sekarang mari kita "lepaskan" kunci asing.
“Lepaskan” Kunci Asing
Kode berikut “menjatuhkan” kunci asing dengan membuat tabel baru tanpa batasan kunci asing, mentransfer data ke tabel tersebut, menghapus tabel asli, lalu mengganti nama tabel baru dengan nama tabel asli.
PRAGMA foreign_keys = OFF;
BEGIN TRANSACTION;
CREATE TABLE Pets_new(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId
);
INSERT INTO Pets_new SELECT * FROM Pets;
DROP TABLE Pets;
ALTER TABLE Pets_new RENAME TO Pets;
COMMIT;
PRAGMA foreign_keys = ON;
Selesai.
Jika Anda perlu merekonstruksi indeks, pemicu, atau tampilan apa pun, lakukan setelah ALTER TABLE
pernyataan yang mengganti nama tabel (tepat sebelum COMMIT
).
Sekarang mari kita periksa tabel untuk batasan kunci asing lagi.
PRAGMA foreign_key_list(Pets);
Hasil:
(Itu kosong karena tidak ada batasan kunci asing di tabel ini.)
Anda dapat menggunakan metode yang sama untuk menambahkan kunci asing ke tabel yang ada.
Metode Alternatif
Saat melihat contoh sebelumnya, Anda mungkin berpikir bahwa ada cara yang lebih efisien untuk melakukannya. Misalnya Anda bisa melakukannya seperti ini:
PRAGMA foreign_keys = OFF;
BEGIN TRANSACTION;
ALTER TABLE Pets RENAME TO Pets_old;
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId
);
INSERT INTO Pets SELECT * FROM Pets_old;
DROP TABLE Pets_old;
COMMIT;
PRAGMA foreign_keys = ON;
Dan itu benar. Dengan contoh saya, metode ini bekerja dengan baik.
Namun metode ini juga berpotensi merusak referensi ke tabel di pemicu, tampilan, dan batasan kunci asing yang ada.
Jadi, jika tabel Anda sudah memiliki pemicu, tampilan, atau batasan kunci asing, mungkin lebih aman menggunakan metode yang disarankan.