30818 skanuj0313 (2)

30818 skanuj0313 (2)



PHP i MySQL dla każdego

Zauważymy od razu, że dane w bazie są niespójne. Książka o identyfikatorze 2 ma przypisanego autora o identyfikatorze 3, tymczasem w tabeli Autorzy nie ma rekordu o identyfikatorze 3. Taką sytuację możemy szybko wykryć, wykorzystując złączenia typu LEFT lub RIGHT JOIN bądź też korzystając z odpowiednio sformułowanego podza-pytania (zob. sekcja „Podzapytania”). Warto jednak unikać tego typu błędów już na etapie wstawiania danych do tabel. MySQL pozwala na wprowadzenie takiego ograniczenia (ang. constraini), które nazywamy więzami spójności (integralności). Otóż możemy poinformować bazę, że kolumna Autorld w tabeli Książki to klucz obcy pochodzący z kolumny Id z tabeli Autorzy. Ogólna konstrukcja wprowadzająca ograniczenie ze względu na klucze obce ma postać:

[CONSTRAINT nazwa] FOREIGN KEY (koltmal. kolumna2.....kolumnaN) REFRENCES

nazwa_tabeli (kolumnal. kolumna2.....kolumnaN)

gdzie:

♦    nazwa jest nazwą ograniczenia, poprzez którą będzie ono identyfikowane. Jeżeli parametr zostanie pominięty, zostanie nadana nazwa systemowa;

♦    kolumny wymienione po słowach FOREIGN KEY definiują, które kolumny w tabeli, dla której definiujemy ograniczenie, zawierają klucz obcy;

♦    nazwajtabeli określa, z której tabeli pochodzi klucz obcy;

♦    kolumny wymienione po REFRENCES nazwajtabeli określają, z których kolumn pochodzi klucz obcy.

Wymienioną konstrukcję należy umieścić za definicją kolumn w instrukcji CREATE TABLE. Przykładowo dla tabeli Książki instrukcja ta miałaby postać:

CREATE TABLE Książki(

Id INTEGER PRIMARY KEY.

Autorld INTEGER.

Tytuł VARCHAR(45).

CONSTRAINT autorzy_ksiazki FOREIGN KEY (autorlD)

REFERENCES Autorzy!Id)

Powstało tu ograniczenie o nazwie autorzy_ksiazki, wiążące kolumnę Autorld w tabeli Książki z kolumną Id w tabeli Autorzy. Po takim zdefiniowaniu tabeli Książki nie uda się nam już wykonać wymienionych wyżej instrukcji INSERT! Serwer nie pozwoli bowiem na wprowadzenie do tabeli Książki rekordu, w którym w kolumnie Autorld będzie się znajdował identyfikator niewystępujący w tabeli Autorzy. Przy próbie wy- | konania takiego zapytania zostanie zgłoszony błąd: Cannot add or update a chi ld row: a foreign key constraint fails (rysunek 11.21). A zatem od tej chwili dla każde-go wiersza w tabeli Książki będzie musiał istnieć odpowiadający mu wiersz w tabeli | Autorzy, spełniający zależność Książki .Autorld - Autorzy. Id.

mysqT> INSERT INTO Książki VALUES(1, 1, ‘Królewski Skrytobójca'), (2, 3, 'Grar e Szaleństwa');

ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint

Rysunek 11.21. Próba wprowadzenia wiersza zawierającego nieistniejące identyfikatory autorów


Wyszukiwarka