Rozdział 11. ♦ Więcej o SQL 329
Korzystanie z kluczy obcych wiąże się niestety z kilkoma ograniczeniami:
♦ Obie tabele, czyli tabela, z której następuje odwołanie, i tabela, do której następuje odwołanie, muszą być typu InnoDB. Dla pozostałych typów tabel instrukcje związane z kluczami obcymi są przyjmowane i nie generują błędu, ale nie mają one znaczenia praktycznego. Według zapowiedzi, w przyszłych wersjach serwera obsługa kluczy obcych zostanie dodana także dla innych rodzajów tabel, w pierwszej kolejności do tabel typu MylSAM.
♦ W tabeli, z której następuje odwołanie, wszystkie kolumny tworzące klucz obcy muszą być zawarte w indeksie. W naszym przykładzie chodzi o indeks dla kolumny Autorld w tabeli Książki. Jeśli taki indeks nie będzie obecny, począwszy od wersji 4.1.2 zostanie utworzony automatycznie. W wersjach przed 4.1.2 próba utworzenia klucza obcego bez istniejącego indeksu zakończy się niepowodzeniem.
♦ W tabeli, do której następuje odwołanie, musi istnieć indeks dla kolumn będących kluczem obcym. W naszym przykładzie musi istnieć indeks dla kolumny Id w tabeli Autorzy. Jeśli taki indeks nie będzie obecny, począwszy od wersji 4.1.2 zostanie utworzony automatycznie. W wersjach przed 4.1.2 próba utworzenia klucza obcego bez istniejącego indeksu zakończy się niepowodzeniem.
♦ Powiązane kolumny w obu tabelach powinny mieć podobny, a jeszcze lepiej taki sam, typ danych, tak aby nie zachodziła konieczność dokonywania przez serwer wewnętrznych konwersji typów.
♦ Sprawdzanie zależności związanych z kluczami obcymi powoduje zmniejszenie wydajności serwera. Przy tworzeniu projektu warto rozważyć, czy i dla których tabel taka funkcjonalność jest faktycznie niezbędna.
Ograniczenia związane z kluczami obcymi nie muszą być nakładane już w trakcie tworzenia tabel. Istnieje możliwość ich późniejszego dodania, za pomocą znanej nam już instrukcji ALTER TABLE. W takim wypadku jej schematyczna postać będzie wyglądała następująco:
ALTER TABLE nazwa_tabeli
ADD [CONSTRAINT nazwał
FOREIGN KEY (kolumnal. kolumna2.....kolumnaN)
REFRENCES nazwa_tabeli Ckolumnal, koluma2.....kolumnaN)
Została ona podzielona na cztery wiersze w celu zwiększenia czytelności, choć może być również w całości zapisana jednym ciągiem. Jeśli zatem w bazie utworzymy tabele Autorzy i Książki za pomocą instrukcji CREATE w postaci:
CREATE TABLE Książki(
Id INTEGER PRIMARY KEY,
Autorld INTEGER.
Tytuł VARCHAR(45)