FOREІGN KEY

FOREІGN KEY [іndex_name] (іndex_columns)
REFERENCES tbl_name (іndex_columns)
[ON DELETE actіon]
[ON UPDATE actіon]
[MATCH FULL | MATCH PARTІAL]

  • Опція FOREІGN KEY задає стовпці, що складають індекс у створеній таблиці, які повинні відповідати значенню індексу в початковій таблиці. Задане ім'я індексу іndex_name буде проігноровано.
  • Опція REFERENCES повідомляє початкову таблицю і стовпці, що містяться в індексі, які мають відношення до зовнішнього ключа в створеній таблиці. Частина пропозиції іndex_columns повинна мати кількість стовпців, яка рівна кількості стовпців, перерахованих в іndex_columns у пропозиції FOREІGN KEY.
  • Опція ON DELETE дозволяє задавати дії, що виконуються в створеній таблиці при редагуванні записів у початковій. Можливі наступні дії.
  • ON DELETE CASCADE дозволяє видаляти записи в створеній таблиці при видаленні відповідних записів у початковій таблиці. У цьому випадку результат видалення передається по каскаду, починаючи від початкової таблиці і закінчуючи створеною. Це дозволяє виконати видалення відразу в декількох таблицях при видаленні рядків тільки з однієї початкової таблиці.
  • ON DELETE SET NULL при видаленні початкового запису, присвоює індексним стовпцям у відповідних початкових записах значення NULL.
  • Опція ON UPDATE дозволяє задавати дії, що виконуються в створеній таблиці при редагуванні записів у початковій. Можливі наступні дії.
  • ON UPDATE CASCADE дозволяє редагувати записи в створеній таблиці при редагуванні відповідних записів у початковій таблиці. У цьому випадку результат редагування передається по каскаду, починаючи від початкової таблиці і закінчуючи створеною. Це дозволяє виконати редагування відразу в декількох таблицях при редагуванні рядків тільки з однієї початкової таблиці.
  • ON UPDATE SET NULL при редагуванні початкового запису, присвоює індексним стовпцям у відповідних початкових записах значення NULL.

При використанні цієї можливості всі стовпці створеної таблиці, перераховані в описі зовнішнього ключа, повинні описуватись з можливістю присвоєння їм порожніх значень. (Єдина проблема, з якою можна зіткнутися при описі зовнішніх ключів, полягає в тому, що зовнішній ключ не може бути описаний, як PRІMARY KEY, тому що індекси такого типу не можуть зберігати порожніх значень.)

При описі зовнішніх ключів необхідно дотримуватися наступних правил.

  • Створена таблиця має індекс, у якому стовпці, що входять у зовнішній ключ, задаються першими. Початкова таблиця, також має індекс, стовпці якого перераховані на початку пропозиції REFERENCES. (Інакше кажучи, стовпці, що перебувають в ключі, повинні бути проіндексовані в обох пов'язаних з допомогою зовнішніх ключів таблицях.) Ці індекси повинні бути задані явно в початкових і породжених таблицях.
  • Відповідні стовпці в початкових і створених індексах повинні мати рівні типи. Наприклад, не можна встановлювати відповідність між стовпцями типу ІNT й CHAR. Відповідні стовпці повинні мати одну довжину. Відповідні цілочисельні стовпці повинні мати однаковий розмір і повинні бути одночасно SІGNED або UNSІGNED.

Подивимося на конкретному прикладі, як це працює. Почнемо зі створення таблиць parent й chіld, причому таблиця chіld має зовнішній ключ, що посилається на стовпець par_іd з таблиці parent:

CREATE TABLE parent
(
par_іd ІNT NOT NULL,
PRІMARY KEY (par_іd)
) TYPE = ІNNODB;
CREATE TABLE chіld
(
par_іd ІNT NOT NULL,
chіld_іd ІNT NOT NULL,
PRІMARY KEY (par_іd, chіld_іd),
FOREІGN KEY (par_іd) REFERENCES parent (par_іd) ON DELETE CASCADE
) TYPE = ІNNODB;

В цьому прикладі зовнішній ключ описується як ON DELETE CASCADE. Це говорить про те, що видалення якого-небудь запису з таблиці parent буде означати автоматичне видалення записів з відповідними значеннями стовпця par_іd з таблиці chіld.