Podstawy kluczy obcych w MySQL?

91

Czy jest jakieś dobre wyjaśnienie, jak używać konstrukcji klucza obcego MySQL?

Nie do końca rozumiem to z samych dokumentów MySQL. Do tej pory zajmowałem się kluczami obcymi z łączeniami i kodem programowania.

A druga część pytania: czy są jakieś ulepszenia do wprowadzenia przy użyciu wbudowanych kluczy obcych MySQL?

Macha
źródło

Odpowiedzi:

117

FOREIGN KEYS po prostu upewnij się, że Twoje dane są spójne.

Nie poprawiają zapytań w sensie wydajności, po prostu powodują, że niektóre błędne zapytania kończą się niepowodzeniem.

Jeśli masz taki związek:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, nie możesz usunąć pliku, departmentjeśli ma jakieś pliki employee.

Jeśli dostarczamy ON DELETE CASCADEdo FOREIGN KEYdefinicji, powoływanie wiersze zostaną automatycznie usunięte wraz z przywoływanych nich.

Jako ograniczenie, FOREIGN KEYfaktycznie trochę spowalnia zapytania.

Podczas usuwania z tabeli, do której istnieje odniesienie lub wstawiania do tabeli, do której istnieją odniesienia, należy przeprowadzić dodatkowe sprawdzenie.

Quassnoi
źródło
1
Spowolnienie jest minimalne, ponieważ FK zwykle tworzy się na polach indeksowanych, co sprawia, że ​​znalezienie odpowiednich wartości jest bardzo proste.
Seb
4
Dlatego napisałem "trochę" :) Właściwie, jeśli usuniesz wiele wierszy, baza JOINmoże być znacznie mniej wydajna niż dwa DELETE używające FULL TABLE SCAN
Quassnoi
2
Przepraszamy za negatywny głos. To był przypadek, ale nie pozwalał mi na zmianę głosu.
Wondercricket
8
@Wondercricket: Nawet nie wiem, co teraz zrobić, to szara strefa w zasadach witryny. Myślę, że kupujesz mi piwo, kiedy jesteś w Moskwie, a my jesteśmy kwita.
Quassnoi
1
@stack: każda aktualizacja, którą wykonujesz w przywoływanych kaskadach kluczy do tabeli odwołań.
Quassnoi,
32

Główne korzyści wynikające z używania prawdziwych kluczy obcych to zapewnienie integralności danych i możliwość skonfigurowania kaskadowych działań na powiązanych elementach, gdy coś zostanie zmodyfikowane lub usunięte.

Na przykład wyobraź sobie, że programujesz forum. Masz tabelę „tematy” z kluczem głównym topics.topic_idi tabelę „posty”, w której posty są dołączone do tematów z kolumną posts.topic_id, która jest kluczem obcym do tabeli tematów.

Ta relacja z kluczem obcym zapewnia, że ​​każdy post jest dołączony do prawidłowego tematu. Jeśli jedyny temat, który posiadasz, ma ID # 1, nie może istnieć post w bazie danych dołączony do tematu # 2. Baza danych zapewnia to.

Aby uzyskać korzyści kaskadowe, możesz ustawić to tak, aby w przypadku usunięcia tematu z tabeli tematów baza danych automatycznie usuwała wszystkie posty w tabeli wiadomości, które były dołączone do tego tematu. Jest to przyjemne, ponieważ usuwa krok, o którym musisz pamiętać, aby wykonać go ręcznie, co może być dość skomplikowane, gdy masz wiele połączonych ze sobą tabel. Za pomocą kluczy obcych wszystkie relacje można wyczyścić automatycznie.

Chad Birch
źródło
11

1. KLUCZE OBCE - po prostu upewnij się, że dane są spójne

2. Jeśli zastosujemy kaskadę usuwania do definicji klucza obcego, wiersz odniesienia zostanie usunięty automatycznie, gdy zostanie usunięty wiersz nadrzędny.

3. Jeśli zastosujemy Update Cascade do definicji klucza obcego, wiersz podrzędny zostanie zaktualizowany automatycznie po zaktualizowaniu wiersza nadrzędnego.

Zapytanie: ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES rodzic (id) ON UPDATE CASCADE ON DELETE CASCADE;

  1. nie można usunąć bezpośrednio tabeli nadrzędnej, najpierw usuń klucz obcy z tabeli podrzędnej, a następnie usuń tabelę nadrzędną.
Gaurav Kumar
źródło
7
W końcu zrozumiałem, co mnie zdezorientowało w przykładach kluczy obcych. Jako ojciec czworga dzieci nie jestem przyzwyczajony do tego, że dziecko pilnuje rodzica . Za jakieś czterdzieści lat może się to już nie wydawać wstecz.
Bob Stein
1
Dziękuję za podanie nazw tabel przykładowych, takich jak „dziecko” i „rodzic”… jest to raczej pomocne i chciałbym, aby to zrobiła oficjalna dokumentacja!
mike gryzoń
7

Główną zaletą jest to, że można ograniczyć wartości, które można wprowadzić do tabeli; jeśli spróbujesz wprowadzić wartość, której nie ma w tabeli, do której się odwołujesz, nie będziesz w stanie tego zrobić.

Ponadto, jeśli zaktualizujesz lub usuniesz wartość w tabeli, do której się odwołujesz, możesz ustawić automatyczną aktualizację wartości lub kaskadowe usuwanie dowolnego wiersza zawierającego tę wartość.

To naprawdę świetna funkcja wykorzystująca twój kod.

Seb
źródło