Materi
Integritas referensial berarti setiap nilai kunci asing menunjuk ke baris yang benar-benar ada di tabel induk. Dokumentasi foreign key SQLite merumuskannya sebagai syarat untuk setiap baris anak: kolom rujukannya NULL, atau ada baris induk dengan kunci itu. Rumusan itu memuat keputusan penting: secara bawaan NULL dianggap memenuhi rujukan. Apakah NULL sah di data kita, misalnya pembeli tamu tanpa akun, adalah aturan bisnis yang ditulis di kontrak, bukan diserahkan pada perilaku mesin.
Kelas Desain Basis Data memakai LEFT JOIN ... WHERE induk.kunci IS NULL untuk mencari baris yatim. Bentuk lain yang setara adalah NOT EXISTS dengan subkueri berkorelasi. Operator EXISTS hanya menanyakan apakah subkueri menghasilkan baris, sehingga NULL di tabel induk tidak memengaruhinya. Bentuk yang tampak paling sederhana justru berbahaya: kolom NOT IN (SELECT kunci FROM induk). Bila kolom kunci induk memuat satu NULL saja, tabel kebenaran IN di dokumentasi SQLite memberi hasil NULL untuk setiap nilai yang tidak ditemukan, sehingga kuerinya tidak mengembalikan baris apa pun.
Penegakan foreign key di SQLite mati secara bawaan dan harus dinyalakan dengan PRAGMA foreign_keys = ON di setiap koneksi. Data yang masuk sebelum itu tidak pernah diperiksa, jadi audit rujukan tetap dijalankan dengan SELECT.
SELECT k.kirim_id, k.kode_gudang
FROM kiriman k
WHERE k.kode_gudang IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM gudang g WHERE g.kode = k.kode_gudang);