Основи іноземних ключів у MySQL?


91

Чи є якесь гарне пояснення того, як використовувати конструкцію зовнішнього ключа MySQL?

Я не зовсім отримую це з самих документів MySQL. До цього часу я обробляв речі, такі як зовнішні ключі, з об'єднаннями та кодом програмування.

І друга частина запитання, чи є якісь вдосконалення за допомогою вбудованих зовнішніх ключів MySQL?

Відповіді:


117

FOREIGN KEYS просто переконайтеся, що ваші дані узгоджені.

Вони не покращують запити з точки зору ефективності, вони просто роблять помилки деяких помилкових запитів.

Якщо у вас такі стосунки:

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))

, тоді ви не можете видалити a, departmentякщо в ньому є деякі employee.

Якщо ви ставите ON DELETE CASCADEдо FOREIGN KEYвизначення, що посилається рядок буде видалена автоматично разом з посилальними з них.

Як обмеження, FOREIGN KEYнасправді трохи уповільнює запити.

Потрібно провести додаткову перевірку під час видалення з таблиці, на яку посилаються, або вставки в таблицю, на яку посилаються.


1
Уповільнення мінімальне, оскільки зазвичай ви робите FK на індексованих полях, що робить пошук відповідних значень швидким.
Себ

4
Ось чому я написав "трохи" :) Насправді, якщо ви видалите безліч рядків, базовий JOIN
фрагмент

2
Вибачте за голос проти. Це було випадково, але це не дозволяє мені змінити свій голос.
Wondercricket

8
@Wondercricket: Я навіть не знаю, що мені робити зараз, це сіра зона в правилах сайту. Я думаю, ти купуєш мені пиво, коли ти в Москві, а ми навіть.
Quassnoi

1
@stack: будь-яке оновлення, яке ви робите для кадрового каскаду посилання на таблицю посилань.
Quassnoi

32

Основними перевагами використання справжніх зовнішніх ключів є забезпечення цілісності даних і можливість налаштування каскадних дій щодо пов’язаних елементів, коли щось змінюється або видаляється.

Наприклад, уявіть, що ви програмуєте форум. У вас є таблиця "теми" з первинним ключем topics.topic_id, і у вас є таблиця "дописи", де дописи додаються до тем зі стовпцем posts.topic_id, який є зовнішнім ключем до таблиці тем.

Цей зв’язок із зовнішнім ключем гарантує, що кожна публікація прикріплюється до дійсної теми. Якщо у вашої єдиної теми є ідентифікатор №1, неможливо існувати допис у базі даних, приєднаній до теми №2. База даних це забезпечує.

Для каскадної переваги ви можете налаштувати його так, що якщо тема видаляється з таблиці тем, база даних автоматично видаляє всі дописи в таблиці повідомлень, які були прикріплені до цієї теми. Це приємно, оскільки він видаляє крок, про який ви повинні пам’ятати, щоб зробити його вручну, що може стати досить складним, коли у вас багато таблиць, пов’язаних між собою. За допомогою зовнішніх ключів усі відносини можна очистити автоматично.


11

1. ІНОЗЕМНІ КЛЮЧИ просто переконайтеся, що ваші дані узгоджені.

2. Якщо ми застосовуємо каскад видалення до визначення зовнішнього ключа, посилання на рядок буде видалено автоматично, коли батьківський рядок буде видалено.

3. Якщо ми застосуємо оновлення Cascade до визначення зовнішнього ключа, дочірній рядок оновиться автоматично, коли батьківський рядок оновиться.

Запит: ALTER TABLE дочірній ДОДАТИ ІНОЗЕМНИЙ КЛЮЧ (parent_id) ПОСИЛАННЯ батьківський (id) НА ОНОВЛЕННЯ КАСКАДУ НА ВИДАЛЕННЯ КАСКАДУ;

  1. Ви не можете видалити безпосередню батьківську таблицю, спочатку видаліть зовнішній ключ із дочірньої таблиці, ніж видаліть батьківську таблицю.

7
Нарешті зрозумів, що мене збентежило у прикладах іноземних ключових слів. Як батько чотирьох дітей, я не звик, щоб дитина відстежувала батьків . Приблизно через сорок років це може здаватися вже не назад.
Bob Stein

1
Дякуємо, що вказали на прикладах назви таких таблиць, як "дитина" та "батько" ... насправді це досить корисно, і я бажаю, щоб це зробила офіційна документація!
гризун mike

7

Головна перевага полягає в тому, що ви можете обмежити, які значення ви можете вводити в таблицю; якщо ви спробуєте ввести значення, яке не існує в таблиці, на яку посилаються, ви не зможете цього зробити.

Крім того, якщо ви оновлюєте або видаляєте значення у вказаній таблиці, ви можете встановити його для автоматичного оновлення значення або видалити каскадом будь-який рядок, що містить це значення.

Це справді чудова функція, яка використовує ваш код.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.