Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] FOREIGN KEY
Forum PHP.pl > Forum > Bazy danych > MySQL
tadeurz
Mam 2 tabele: (ich strukturę podaję niżej, nie zagłębiam się w szczegóły takie jak typy,index,primay key.)
USER -> id ; login ; password ;
PROFILE -> user_id ; rank ; point ; avatar ;

Chce w myPHPAdmin powiazać te 2 tabele relacją -> 1:1

Więc tak (po skrócie):
Tabele mają mechanizmy InnoDB.
Pole USER->id = PRIMARY, AUTO_INCREMENT;
Pole PROFILE->user_id = PRIMARY;
Wchodzę w tabele PROFILE -> Struktura -> Widok relacyjny = ustawiam łącze -> user_id:`db15982`.`user`.`id` ON DELETE:CASCADE ON UPDATE:CASCADE
MySQL zwraca mi:

  1. Zapytanie SQL zostało wykonane pomyślnie
  2. ALTER TABLE `profile` ADD FOREIGN KEY ( `user_id` ) REFERENCES `db606440`.`user` (
  3. `id`
  4. ) ON DELETE CASCADE ON UPDATE CASCADE ;


Teraz jeżeli dodam nowego użytkownika do tabeli USER powinien mi automatycznie dodać rekord w PROFILE ale tego nie robi, dlaczego ? Musze jeszcze w tabeli USER dodać łącze do pola user_id ?
sazian
to działa inaczej
do tabeli PROFILE nie możesz dodać użytkownika o innym id niż te w tabeli USER


jeśli chcesz automatyczne dodawanie musisz zrobić wyzwalacz (trigger)
tadeurz
To co daje ustawienie tych relacji w mySQL questionmark.gif Satysfakcje ?
Ale jak będę usuwał rekord w USER to usunie mi rekord w PROFILE ? Czy też muszę pisać triggera questionmark.gif
sazian
nie pozwalają na dodawanie danych niespójnych
to znaczy jeśli masz użytkowników o id 1,2,3,4 to nie możesz stworzyć profilu gdzie id usera będzie 5 bo takiego nie ma w tabeli z użytkownikami

co do usuwania

masz ustawione ON DELETE CASCADE czyli usunięcie czegoś z tabeli nadrzędnej (user) powoduje usunięcie wpisów z tabel podrzędnych (u ciebie profile)


za co teraz powiem pewnie wiele osób mnie zbeszta ale co tam smile.gif

generalnie nie stosuje się kluczy obcych bo tylko komplikują życie. Często blokują usuwanie rekordów chociaż chcemy to zrobić świadomie, a do tego spowalniają dodawanie rekordów ...

Rozmawiałem kiedyś na ten temat z kolegą który pracuje w firmie piszącej aplikacje dla pewnego banku i przyznał mi rację, oni też nie stosują kluczy obcych. A skoro w banku dużym banku nie stosują to dlaczego ja mam to robić smile.gif

tylko pamiętaj żeby ustawić indeksy na kolumnach do złączeń, one znacząco przyspieszają zapytania
trafas
To fakt że klucze obce spowalniają działanie.
Często jest tak, że "pilnowanie" kluczy przerzuca się z poziomu bazy na warstwę aplikacji.
tadeurz
dziękuję za informacje.
Plus dla ciebie sazian
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.