Spójność referencyjna

Reguła gwarantująca, że klucze obce zawsze wskazują na istniejące wiersze w powiązanej tabeli. Zapobiega osieroconym rekordom.

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 DELETE i UPDATE na 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).