| Атрибут FOREIGN KEY в MySQL використовується для встановлення зв’язків між таблицями в базі даних. Він дозволяє визначити, що значення в одному стовпці (або комбінації стовпців) однієї таблиці посилається на значення в іншій таблиці. Це забезпечує цілісність даних в базі, оскільки дозволяє уникати порушень зв’язків між таблицями, таких як наявність посилання на неіснуючі записи. Зовнішній ключ створює реляційний зв’язок між двома таблицями, зазвичай між первинним ключем однієї таблиці та зовнішнім ключем в іншій. | |
| Зв’язок між таблицями | Зовнішній ключ визначає посилання між таблицями: значення у стовпці однієї таблиці посилаються на значення у стовпці іншої таблиці. |
| Цілісність даних | Встановлення зовнішнього ключа дозволяє забезпечити referential integrity, тобто підтримувати консистентність даних між таблицями. Наприклад, ви не зможете вставити запис із посиланням на неіснуючий запис в іншій таблиці. |
| Типи обмежень | ON DELETE: Описує, що відбувається з рядками в дочірній таблиці при видаленні запису в батьківській таблиці (наприклад, CASCADE, SET NULL). ON UPDATE: Описує, що відбувається з рядками в дочірній таблиці при оновленні значення в батьківській таблиці. |
Приклад застосування при створенні таблиці
CREATE TABLE customers (
customer_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers (customer_id)
);
INSERT INTO customers (customer_name) VALUES ('John Doe');
INSERT INTO orders (order_date, customer_id) VALUES ('2025-05-20', 1);
INSERT INTO orders (order_date, customer_id) VALUES ('2025-05-20', 999);
-- останній INSERT не виконається,
-- оскільки id 999 нема в таблиці customers
CASCADE, SET NULL, RESTRICT, NO ACTION
| ON DELETE CASCADE | Якщо в таблиці customers буде видалено клієнта, то всі замовлення, які до нього відносяться, також будуть видалені. |
| ON DELETE SET NULL | Якщо клієнт буде видалений, то значення в стовпці customer_id таблиці orders буде встановлено в NULL замість видалення замовлень. |
| ON UPDATE CASCADE | Якщо значення в customer_id в таблиці customers зміниться, то це значення буде автоматично оновлено у всіх рядках таблиці orders, де воно використовується. |
Типи обмежень
| Тип обмеження | Опис |
| CASCADE | Операція (видалення або оновлення) в батьківській таблиці буде автоматично застосована до дочірньої таблиці. |
| SET NULL | При видаленні або оновленні запису в батьківській таблиці значення в дочірній таблиці буде змінено на NULL. |
| RESTRICT | Забороняє операцію видалення або оновлення в батьківській таблиці, якщо є відповідні записи в дочірній таблиці. |
| NO ACTION | Аналогічно до RESTRICT, але дія відбувається після виконання всіх інших перевірок. |
Приклад використання FOREIGN KEY разом із CASCADE:
CREATE TABLE orders2 (
order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
customer_id INT,
FOREIGN KEY (customer_id)
REFERENCES customers (customer_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Приклад використання FOREIGN KEY разом із SET NULL:
CREATE TABLE orders3 (
order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
customer_id INT,
FOREIGN KEY (customer_id)
REFERENCES customers (customer_id)
ON DELETE SET NULL
);
Приклад використання FOREIGN KEY разом із RESTRICT:
CREATE TABLE orders4 (
order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
customer_id INT,
FOREIGN KEY (customer_id)
REFERENCES customers (customer_id)
ON DELETE RESTRICT
ON UPDATE RESTRICT
);
Приклад використання FOREIGN KEY разом із NO ACTION:
CREATE TABLE orders5 (
order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
customer_id INT,
FOREIGN KEY (customer_id)
REFERENCES customers (customer_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
Для додаткової візуалізації є відео: