W tabeli uczniowie zdefiniowano klucz obcy
FOREIGN KEY (klasa_id) REFERENCES klasy (id)Oznacza to, że
klasa_id powtarza się u uczniów jednej klasy, więc nie identyfikuje ucznia. Klucz główny definiuje PRIMARY KEY.klasa_id inna niż NULL istniała jako id w tabeli klasy.ON DELETE CASCADE działa od klasy do uczniów, nie odwrotnie.REFERENCES, czyli id. Nazwy nie muszą być zgodne.Klucz obcy łączy kolumnę jednej tabeli z kolumną innej. Zapis FOREIGN KEY (klasa_id) REFERENCES klasy (id) mówi: kolumna klasa_id w tabeli uczniowie wskazuje na kolumnę id w tabeli klasy. Baza pilnuje integralności referencyjnej, więc nie pozwoli zapisać ucznia z numerem klasy, której nie ma.
Próba INSERT INTO uczniowie (nazwisko, klasa_id) VALUES ('Nowak', 99); przy braku klasy o id 99 zakończy się błędem. Wartość NULL jest dozwolona, jeśli kolumna jej nie zabrania, i oznacza ucznia bez przypisanej klasy. Taki układ to relacja jeden do wielu: jedna klasa, wielu uczniów. Kolumna wskazywana, tutaj klasy.id, musi być kluczem głównym albo mieć indeks unikalny.
Błędne odpowiedzi mylą role kolumn albo przypisują kluczowi obcemu działania, których nie wykonuje. Klucz główny tabeli uczniowie to osobna kolumna, np. id ucznia, zdefiniowana przez PRIMARY KEY. klasa_id nie identyfikuje ucznia, bo w jednej klasie jest wielu uczniów z tą samą wartością.
Nazwy kolumn po obu stronach nie muszą być takie same. W nawiasie po REFERENCES stoi nazwa kolumny w tabeli klasy, czyli id, i tylko ona musi tam istnieć. Zgodny musi być typ danych, nie nazwa.
Klucz obcy domyślnie niczego nie usuwa. Kasowanie powiązanych rekordów włącza się jawnie przez ON DELETE CASCADE, i to w odwrotnym kierunku: usunięcie klasy mogłoby usunąć jej uczniów. Usunięcie ucznia nigdy nie usuwa klasy, w której jest wielu innych uczniów.
Czytaj zapis od lewej: kolumna w nawiasie należy do tabeli bieżącej, a po REFERENCES stoi tabela nadrzędna.