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.