Rozdział 5: Relacje pomiędzy tabelami

W poprzednim wpisie tworzyliśmy tabelę o nazwie „company” teraz wyobraźmy sobie sytuacje w której każda osoba mająca wpis w tabelce „user” może zarządzać wpisami z tabeli „company” (oczywiście nie wszystkimi, a tylko tymi do których ma przypisaną relację).

Po takim wstępie przechodzimy płynnie do relacji pomiędzy tabelami.
Na razie opiszę to tekstowo.

Użytkownik „kamil” posiada id: 1 i jest właścicielem firmy o nazwie „Kamilbud„.
Użytkownik „krzysiek” posiada id: 2 i jest właścicielem firmy „softpro” oraz „develop„.

Baza wyglądała by mniej więcej tak:

idname
1Kamil
2Krzysiek
tabela „User
 idid_username
1Kamilbud
22Softpro
32Develop 
Tabela „Company

Przedstawienie danych w postaci tabel wyjaśnia raczej wszystko. Relacja odbywa się na podstawie kolumny „id” z tabeli „User” oraz tabeli „id_user” z tabeli „Company„.

Co zatem w sytuacji gdy zmieni się id użytkownika, lub zostanie on usunięty ?
Warto powiadomić bazę danych o owej relacji i zarazem zautomatyzować część procesów.

Zapiszmy zatem zapytanie które dokona aktualizacji tabel w naszej bazie danych:

ALTER TABLE `company`
          ADD CONSTRAINT relation_1 FOREIGN KEY (user_id)
          REFERENCES `user(id)` ON DELETE cascade ON UPDATE cascade

Powyższe zapytanie aktualizuje tabelę o nazwie „company„, dodając relacje o nazwie „relation_1” ustawiając klucz obcy na kolumnie „user_id„.
Kolumna „user_id” stworzy referencje z kolumną „id” z tabeli „user”.
W sytuacji gdy wpis w kolumnie „user” zostanie usunięty, usunięte zostaną wszystkie powiązane wpisy z tabeli „company„. W sytuacji gdy zmieni się „id” użytkownika, zostanie zaktualizowana odpowiednia wartość w tabeli „company„.

Powyżej użyliśmy funkcji „cascade„, poniżej zaś przedstawiam cały szereg możliwości:

  • CASCADE – w sytuacji aktualizacji, zaktualizowane zostaną wartości w obu kolumnach, to samo tyczy się usuwania danych
  • RESTRICT – nie pozwala na dokonanie zmian, w sytuacji gdy te naruszają powiązanie
  • SET NULL – ustawia wartość „null” w sytuacji aktualizacji bądź modyfikacji powiązanych danych z innej tabeli
  • NO ACTION – nie podejmuje żadnych akcji