Jak działa FOREIGN KEY w języku SQL? Przykłady zastosowania

Jak działa FOREIGN KEY w języku SQL? Przykłady zastosowania

Jeżeli kiedykolwiek miałeś styczność z relacyjnymi bazami danych, na pewno spotkałeś się z kluczem obcym (FOREIGN KEY). Jest to jeden z kluczowych elementów zapewniających integralność danych oraz ich poprawne powiązanie między tabelami. W tym artykule pokażę, jak działa FOREIGN KEY w języku SQL, do czego można go wykorzystać i jak unikać typowych błędów.

Czym jest FOREIGN KEY?

FOREIGN KEY (klucz obcy) to ograniczenie (constraint) w SQL, które tworzy relację między dwiema tabelami. Klucz obcy w jednej tabeli wskazuje na klucz główny (PRIMARY KEY) w innej tabeli, zapewniając, że wartości w kolumnie klucza obcego zawsze odpowiadają istniejącym wartościom w tabeli nadrzędnej.

Dlaczego warto używać kluczy obcych?

FOREIGN KEY w SQL ma kilka kluczowych zalet:

  • Zapewnia spójność danych – nie pozwala na dodawanie rekordów z nieistniejącymi odniesieniami.
  • Wymusza integralność referencyjną – zapobiega usunięciu rekordów, do których odwołują się inne tabele.
  • Pomaga uniknąć anomalii w bazie danych, takich jak osierocone rekordy.
  • Może poprawić wydajność zapytań, jeśli baza danych odpowiednio optymalizuje indeksy.

Jak utworzyć klucz obcy w SQL?

Aby zdefiniować FOREIGN KEY, należy określić kolumnę (lub kolumny), która ma być kluczem obcym, oraz tabelę i kolumnę nadrzędną, do której ma się odnosić. Oto podstawowa składnia w SQL:

CREATE TABLE zamowienia (
    id INT PRIMARY KEY,
    klient_id INT,
    FOREIGN KEY (klient_id) REFERENCES klienci(id)
);

W tym przypadku tabela zamowienia posiada klucz obcy klient_id, który wskazuje na kolumnę id w tabeli klienci. Oznacza to, że każdy wpis w tabeli zamowienia musi odnosić się do istniejącego klienta.

Dodanie klucza obcego po utworzeniu tabeli

Jeżeli tabela istnieje już w bazie danych, możemy dodać do niej klucz obcy za pomocą ALTER TABLE:

ALTER TABLE zamowienia
ADD CONSTRAINT fk_klient
FOREIGN KEY (klient_id) REFERENCES klienci(id);

ON DELETE i ON UPDATE – czyli co się stanie po usunięciu rekordu?

Podczas tworzenia kluczy obcych możemy określić, co ma się stać z rekordami, gdy zostanie usunięty lub zaktualizowany rekord nadrzędny. Najczęściej używane opcje to:

  • ON DELETE CASCADE – usuwa wszystkie powiązane rekordy, gdy usuniemy wpis w tabeli nadrzędnej.
  • ON DELETE SET NULL – ustawia wartość klucza obcego na NULL, gdy rekord nadrzędny zostanie usunięty.
  • ON DELETE RESTRICT – nie pozwala na usunięcie rekordu nadrzędnego, jeśli istnieją do niego odniesienia.
  • ON DELETE NO ACTION – domyślne zachowanie, które nie pozwala na usunięcie, jeżeli są powiązane rekordy.

Przykład użycia ON DELETE CASCADE:

CREATE TABLE zamowienia (
    id INT PRIMARY KEY,
    klient_id INT,
    FOREIGN KEY (klient_id) REFERENCES klienci(id) ON DELETE CASCADE
);

Przykładowa tabela z kluczem obcym

Tabela Kolumna Typ danych Opis
klienci id INT PRIMARY KEY Unikalny identyfikator klienta
zamowienia id INT PRIMARY KEY Unikalny identyfikator zamówienia
zamowienia klient_id INT FOREIGN KEY Identyfikator klienta – powiązanie z tabelą klienci

Najczęstsze błędy związane z FOREIGN KEY

Podczas pracy z kluczami obcymi możesz natknąć się na kilka problemów. Oto najczęstsze:

  1. Nieistniejąca wartość w tabeli nadrzędnej – nie można dodać rekordu, jeśli wartość klucza obcego nie istnieje w tabeli nadrzędnej.
  2. Brak zgodności typów – kolumny w obu tabelach muszą mieć te same typy danych.
  3. Próba usunięcia rekordu z tabeli nadrzędnej, gdy ON DELETE RESTRICT lub brak określonego działania.
  4. Brak indeksu w tabeli nadrzędnej – kolumna, do której odnosi się klucz obcy, musi być kluczem głównym lub unikalnym indeksem.

Podsumowanie

Klucze obce (FOREIGN KEY) w bazach danych SQL to potężne narzędzie zapewniające integralność i spójność danych. Są niezbędne w dobrze zaprojektowanych schematach relacyjnych, ułatwiają pracę deweloperom i pomagają unikać błędów. Pamiętaj o odpowiednim planowaniu struktur baz danych, aby unikać potencjalnych problemów z usuwaniem i aktualizacją danych.

 

Inny ciekawy artykuł:

Jak działa INDEX w języku SQL? Przykłady zastosowania

KajoDataSpace