Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Klucze obce MySQL

Klucze obce są integralną częścią tworzenia relacji w relacyjnych bazach danych. Oto dlaczego i jak je tworzyć.

Ustaliliśmy więc, że klucz podstawowy zapewnia unikalny identyfikator tabeli. Ale klucze podstawowe nie są jedynym typem „klucza”. Nasza baza danych może również zawierać klucze obce.

Co to jest klucz obcy?

klucz obcy to kolumna (lub zbiór kolumn) w jednej tabeli, która jednoznacznie identyfikuje wiersz innej tabeli. Definiuje to relację między dwiema tabelami.

Klucz obcy umożliwia odwoływanie się do powiązanych danych w tabelach. Jest to przydatne, gdy kolumna zawiera dane reprezentowane w innej tabeli.

Przykład

Oto schemat naszego FruitShop baza danych pokazująca relacje między Owocami tabela i Jednostki stół.

Czarna linia łącząca dwie tabele wskazuje klucz obcy. UnitId pole na Owocu tabela jest kluczem obcym do UnitId pole w Jednostkach stół. Dlatego wartość, którą wstawiamy do Fruit.UnitId musi odpowiadać wartości w Units.UnitId . Dzięki temu Fruit.UnitId do odwoływania się do danych w innych kolumnach dla tego rekordu (tj. rekordu, który ma odpowiedni UnitId ).

Dane

Więc jeśli nasze Owoce tabela zawiera taki rekord:

FruitId FruitName Inwentarz Identyfikator jednostki Data wprowadzenia Aktualizacja
1 Jabłko 10 3 27.11.2012 12:42:10 27.11.2012 12:42:10

I nasze Jednostki tabela zawiera następujące rekordy:

UnitId Nazwa jednostki Data wprowadzenia Aktualizacja
1 Sztuka 2011-12-30 12:46:15 2011-12-30 12:46:15
2 Wiązka 2011-12-30 12:46:15 2011-12-30 12:46:15
3 Kilogram 2011-12-30 12:46:15 2011-12-30 12:46:15
4 Pojemnik 2011-12-30 12:46:15 2011-12-30 12:46:15
5 Funt 2011-12-30 12:46:15 2011-12-30 12:46:15
6 Uncja 2011-12-30 12:46:15 2011-12-30 12:46:15

Widać, że Fruit.UnitId pole zawiera 3 . Teraz spójrz na Jednostki tabela dla rekordu, który zawiera 3 w UnitId pole. Widać, że ten rekord reprezentuje Kilogram . Dlatego teraz wiemy, że jabłka mierzy się w kilogramach.

Dobrą rzeczą w konfigurowaniu bazy danych w ten sposób jest to, że nie musimy powtarzać „Kilogramów” dla każdego rekordu, który używa tej jednostki. Ograniczenie duplikacji to kluczowa zaleta systemów zarządzania relacyjnymi bazami danych.

Widząc jak najwięcej rekordów w Owocu tabela będzie miała tę samą nazwę jednostki (np. "Kilogramy", "Pojemnik", "Pęczek" itp.), powinniśmy dokładnie przemyśleć przed dodaniem duplikatów do naszej bazy danych. Bez używania relacji klucza obcego moglibyśmy po prostu zapisać nazwy jednostek bezpośrednio w Owocu tabeli (i być może nazwij kolumnę "Unit", "UnitType" lub "UnitName"). Wtedy otrzymalibyśmy wiele rekordów o tej samej wartości w kolumnie nazwy jednostki. Widzieliśmy „Kilogram” powtarzany w kółko w stosunku do wielu rekordów. Zobaczylibyśmy również powtórzenie „Pęczka” i każdego innego popularnego typu jednostek.

Chociaż niekoniecznie jest to „złe”, ogólnie bardziej wydajne jest przechowywanie jednego rekordu dla każdej nazwy jednostek w osobnej tabeli, a następnie odwoływanie się do tej tabeli za pomocą UnitId kolumna. Jest to bardziej wydajne niż powtarzanie tych nazw jednostek w kółko dla każdego rekordu utworzonego w Fruits stół. Ułatwia to również, jeśli kiedykolwiek zdecydujemy się zaktualizować nazwę jednostki (na przykład zmień „Kilogramy” na „Kilosy”). Jeśli zaktualizujemy nazwę jednostki, nie wpłynie to na Owoc tabeli, ponieważ UnitId pozostanie bez zmian. Dodatkowo pomaga również zapobiegać pojawianiu się niespójnych danych w naszej bazie danych.

Ograniczenie dotyczące klucza obcego

Ograniczenie klucza obcego to obiekt bazy danych, który pomaga w utrzymaniu spójności danych klucza obcego. Tworzysz ograniczenie klucza obcego, aby zachować integralność referencyjną. Tworząc ograniczenie klucza obcego, mówisz MySQL, aby wymusił na danych określone reguły. Gdy dane są wstawiane, usuwane lub aktualizowane, MySQL sprawdzi, czy jest zgodny z kluczem obcym, który utworzyłeś między tabelami. Jeśli nie, zapobiegnie to zapisywaniu/nadpisywaniu/usuwaniu danych, zachowując w ten sposób integralność referencyjną.

Na przykład, jeśli użytkownik próbuje wprowadzić wartość UnitId w Fruit.UnitId kolumna, ale nie ma odpowiedniego rekordu w Units.UnitId kolumna, wtedy MySQL uniemożliwi użytkownikowi wprowadzenie tej wartości.

Kiedy utworzyliśmy nasze dwie tabele, dodaliśmy ograniczenie klucza obcego do Owoców stół. Oto kod, którego użyliśmy do utworzenia ograniczenia:

CONSTRAINT fkFruitUnits FOREIGN KEY (UnitId) REFERENCES Units (UnitId) ON DELETE RESTRICT ON UPDATE CASCADE

Po rozwinięciu węzłów w lewym SCHEMACIE możesz zobaczyć utworzony przez nas klucz obcy (oraz klucze podstawowe):

Jeśli spróbujesz wstawić dane, które nie są zgodne z ograniczeniem klucza obcego, powinieneś otrzymać błąd.

Na przykład, jeśli spróbuję wstawić rekord do Owoców tabela przy użyciu UnitId wartość, która nie istnieje w Jednostkach tabeli, otrzymuję następujący błąd:

Dzieje się tak, ponieważ próbuję wstawić wartość 5 do UnitId kolumna, gdy nie ma odpowiadającej wartości w Units.UnitId pole.

Aby to się udało, musiałbym upewnić się, że istnieje zapis w Jednostkach tabela z UnitId z 5 .

Klucz zagraniczny nie działa?

Możesz napotkać okazjonalną sytuację, w której klucz obcy wydaje się nie działać. Na przykład możesz z powodzeniem wstawić dane do tabeli, nawet jeśli istnieje klucz obcy, który powinien uniemożliwić wstawienie tych danych.

W tej sytuacji możesz sprawdzić kilka rzeczy.

  • Upewnij się, że dodałeś ON DELETE i ON UPDATE klauzule w kodzie. Na przykład ON DELETE RESTRICT ON UPDATE CASCADE . Zobacz nasz przykład CREATE TABLE, aby dowiedzieć się, kiedy umieścić ten kod.
  • Upewnij się, że tabela to InnoDB . Możesz to zrobić, dodając ENGINE=InnoDB na końcu CREATE TABLE oświadczenie (patrz mój przykład z czasu, gdy stworzyliśmy nasze tabele). Niektóre silniki (takie jak MyISAM ) nie obsługują ograniczeń klucza obcego, ale nie zawierają żadnego ostrzeżenia na ten temat podczas próby utworzenia ograniczenia klucza obcego. Jeśli domyślnym silnikiem nie jest InnoDB wtedy jest prawdopodobne, że twoje klucze obce nie będą obsługiwane.
  • Upewnij się, że MySQL faktycznie sprawdza klucze obce. Możesz to zrobić, uruchamiając następujący kod:SET FOREIGN_KEY_CHECKS=1 .

Wyłącz sprawdzanie klucza obcego

Może się zdarzyć, że ograniczenia kluczy obcych mogą stać się niepotrzebnie restrykcyjne — do tego stopnia, że ​​poważnie utrudnią ładowanie danych. Na przykład, gdy właśnie utworzyłeś bazę danych i musisz załadować początkowe dane. Lub jeśli potrzebujesz usunąć kilka tabel i ponownie załadować dane.

Jeśli nie załadujesz danych we właściwej kolejności, prawdopodobnie będziesz otrzymywać błędy kluczy obcych, ponieważ dane są ładowane w złej kolejności (tj. próbujesz załadować tabele podrzędne, zanim tabele nadrzędne będą miały swoje dane załadowane).

To nie jest tylko problem podczas ładowania dane. Możesz również napotkać ten problem podczas tworzenia bazy danych w pierwszej kolejności. Jeśli nie utworzysz tabel we właściwej kolejności, możesz napotkać błędy spowodowane ograniczeniami klucza obcego.

Jeśli nie znasz prawidłowej kolejności rodzic-dziecko, ustalenie właściwej kolejności tworzenia bazy danych lub ładowania danych może zająć dużo czasu i wysiłku. W takich przypadkach lepiej byłoby tymczasowo poinformować MySQL, aby na razie nie sprawdzał kluczy obcych.

Możesz wyłączyć sprawdzanie klucza obcego za pomocą następującego kodu:

FOREIGN_KEY_CHECKS=0

Aby ponownie włączyć, wykonaj następujące czynności:

FOREIGN_KEY_CHECKS=1

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Korzystanie z funkcji agregujących (SUM, AVG, MAX, MIN, COUNT, DISTINCT) w MySQL

  2. Generowanie losowego i unikalnego ciągu 8 znaków za pomocą MySQL

  3. Java:Wstaw wiele wierszy do MySQL za pomocą PreparedStatement

  4. Jak mogę wyświetlić te same dane identyfikatora z pętlą while w PHP?

  5. Zmiana strefy czasowej MySQL?