SQLite menyertakan pernyataan PRAGMA yang memungkinkan Anda memeriksa pelanggaran kunci asing di seluruh database atau tabel tertentu.
Pernyataannya adalah PRAGMA foreign_key_check
, dan ini berfungsi sebagai berikut.
Sintaks
Anda dapat menggunakannya dengan salah satu dari dua cara:
PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);
Baris pertama memeriksa seluruh database, sedangkan baris kedua hanya memeriksa tabel tertentu.
schema
opsional argumen menentukan nama database terlampir atau utama atau suhu untuk database utama dan TEMP. Jika schema
dihilangkan, utama diasumsikan.
Contoh
Mari kita buat dua tabel dengan hubungan di antara mereka.
Dalam hal ini, Hewan Peliharaan tabel memiliki kunci asing yang mereferensikan TypeId kolom pada Jenis tabel.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Sekarang mari kita masukkan data yang melanggar batasan kunci asing.
PRAGMA foreign_keys = OFF;
INSERT INTO Types VALUES
( 1, 'Dog' ),
( 2, 'Cat' );
INSERT INTO Pets VALUES
( 1, 'Homer', 3 );
INSERT
kedua pernyataan melanggar batasan kunci asing. Ini karena memasukkan nilai 3 ke dalam Pets.TypeId kolom, ketika tidak ada nilai yang sesuai di Types.TypeId kolom.
Hal penting yang perlu diperhatikan di sini adalah saya secara eksplisit menonaktifkan kunci asing dengan menggunakan PRAGMA foreign_keys = OFF
. Ini adalah pengaturan default di SQLite, tetapi saya ingin memperjelas contoh ini.
Sekarang mari kita periksa database untuk pelanggaran kunci asing.
PRAGMA foreign_key_check;
Hasil:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0
Ini memberitahu kita bahwa Hewan Peliharaan tabel memiliki pelanggaran kunci asing pada baris dengan ROWID 1. Ini juga memberi tahu kita nama tabel induk, serta ID kunci asing.
Mari tambahkan lebih banyak data ke Hewan Peliharaan tabel dan jalankan cek lagi. Dua baris pertama mematuhi kunci asing, tetapi baris terakhir tidak.
INSERT INTO Pets VALUES
( NULL, 'Yelp', 1 ),
( NULL, 'Fluff', 2 ),
( NULL, 'Brush', 4 );
PRAGMA foreign_key_check;
Hasil:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Kami sekarang memiliki dua baris yang dikembalikan saat memeriksa seluruh database untuk pelanggaran kunci asing.
Periksa Tabel Tertentu
Anda juga dapat menentukan tabel untuk menjalankan pemeriksaan.
Berikut adalah contoh penulisan ulang cek sebelumnya untuk menentukan hanya Hewan Piaraan tabel.
PRAGMA foreign_key_check(Pets);
Hasil:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Hasil yang sama.
Inilah hasilnya jika saya menentukan tabel lainnya.
PRAGMA foreign_key_check(Types);
Hasil:
(Kosong karena tidak ada hasil.)
Tentukan Skema
Seperti yang disebutkan, Anda juga dapat menentukan skema.
PRAGMA main.foreign_key_check(Pets);
Hasil:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Dalam kasus saya, saya menggunakan database utama, tetapi Anda dapat mengganti main
dengan nama database terlampir Anda.
Cara Menerapkan Kunci Asing
Seperti yang disebutkan, SQLite tidak menerapkan kunci asing kecuali Anda secara eksplisit menentukan bahwa kunci tersebut harus diterapkan.
Anda dapat menerapkan kunci asing menggunakan PRAGMA foreign_keys = ON
.
Lihat Cara Mengaktifkan Dukungan Kunci Asing di SQLite untuk informasi dan contoh selengkapnya.