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:
id | name |
1 | Kamil |
2 | Krzysiek |
id | id_user | name |
1 | 1 | Kamilbud |
2 | 2 | Softpro |
3 | 2 | Develop |
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