Spójność referencyjna (referential integrity) to reguła bazy danych, która pilnuje, żeby każdy klucz obcy (FOREIGN KEY) wskazywał na realnie istniejący wiersz w tabeli nadrzędnej — albo na nic (NULL), jeśli na to pozwolisz. W praktyce oznacza to jedno: nie da się dodać zamówienia dla klienta, którego nie ma, ani po cichu usunąć klienta, który ma jeszcze otwarte zamówienia. Dzięki temu w bazie nie powstają tzw. osierocone rekordy (orphaned records) — wiersze, które wskazują na pustkę.
Jak to działa
Mechanizm opiera się na relacji między dwiema tabelami: nadrzędną (z kluczem głównym, PRIMARY KEY) i podrzędną (z kluczem obcym, który ten klucz główny powtarza). Silnik bazy przy każdej operacji INSERT, UPDATE i DELETE sprawdza, czy relacja nadal się zgadza. Jeśli próbujesz wstawić wartość klucza obcego, której nie ma po drugiej stronie — dostajesz błąd zamiast cichego śmiecia w danych.
Możesz też zdefiniować, co ma się dziać przy usuwaniu lub zmianie rodzica: ON DELETE CASCADE usunie razem z nim dzieci, ON DELETE RESTRICT zablokuje operację, a ON DELETE SET NULL wyzeruje klucz obcy. To Ty decydujesz o polityce — baza tylko jej pilnuje.
Przykład z praktyki
W PostgreSQL czy MySQL (InnoDB, bo MyISAM kluczy obcych w ogóle nie egzekwuje) deklarujesz to tak:
CREATE TABLE zamowienia (id INT PRIMARY KEY, klient_id INT REFERENCES klienci(id) ON DELETE RESTRICT);
Od tej chwili INSERT INTO zamowienia (id, klient_id) VALUES (1, 999) — gdy klienta o id 999 nie ma — zwróci błąd typu foreign key constraint fails. Baza Cię obroniła przed bałaganem.
Na co uważać
- MySQL z MyISAM przyjmuje składnię klucza obcego, ale jej nie wymusza — łatwo złapać fałszywe poczucie bezpieczeństwa. Używaj InnoDB.
- Kolejność operacji przy masowym imporcie potrafi sypać błędami — wstawiaj najpierw rodziców, potem dzieci.
- Brak indeksu na kolumnie klucza obcego = wolne
DELETEiUPDATEna dużych tabelach. - Walidacja tylko w aplikacji to nie to samo. Logika w kodzie da się obejść, ograniczenie w bazie — nie.
Pojęcia powiązane
Klucz obcy (FOREIGN KEY), klucz główny (PRIMARY KEY), ograniczenia (constraints), normalizacja, transakcje i ACID, kaskadowe usuwanie (ON DELETE CASCADE), integralność danych (data integrity).