Зовнішній ключ (FOREIGN KEY) потрібен для того, щоб зв’язати дві різні таблиці між собою. Зовнішній ключ може посилатися на будь-який стовпець у батьківській таблиці. Проте загальноприйнятою практикою є посилання зовнішнього ключа на первинний ключ (primary key) батьківської таблиці. Наприклад:

Тут поле customer_id в таблиці Orders є FOREIGN KEY, який посилається на поле id в таблиці Customers. Це означає, що значенням customer_id (таблиці Orders) повинно бути значення зі стовпця id (таблиці Customers).
Створення зовнішнього ключа
Тепер давайте подивимося, як ми можемо додати обмеження FOREIGN KEY:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
-- Ця таблиця не має зовнішнього ключа CREATE TABLE Customers ( id INT, first_name VARCHAR(40), last_name VARCHAR(40), age INT, country VARCHAR(10), CONSTRAINT CustomersPK PRIMARY KEY (id) ); -- Додаємо зовнішній ключ до поля customer_id. -- Зовнішній ключ посилається на поле id таблиці Customers CREATE TABLE Orders ( order_id INT, item VARCHAR(40), amount INT, customer_id INT REFERENCES Customers(id), CONSTRAINT OrdersPK PRIMARY KEY (order_id) ); |
Тут стовпець customer_id таблиці Orders посилається на стовпець id таблиці Customers.
Примітка: Вищенаведений код створення зовнішнього ключа може відрізнятися в різних СУБД.
Вставка даних у таблицю із зовнішнім ключем
Спробуємо вставити дані у таблицю із зовнішнім ключем.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- Спочатку вставляємо дані до таблиці без зовнішнього ключа INSERT INTO Customers VALUES (1, 'John', 'Doe', 31, 'USA'), (2, 'Robert', 'Luna', 22, 'USA'); -- Перша операція вставки даних проходить успішно INSERT INTO Orders VALUES (1, 'Keyboard', 400, 2), (2, 'Mouse', 300, 2), (3, 'Monitor', 12000, 1); -- Друга операція вставки даних призводить до помилки, оскільки customer_id зі значенням 7 немає INSERT INTO Orders VALUES (4, 'Keyboard', 400, 7); |
Навіщо використовувати зовнішній ключ?
Дві головні причини:
Нормалізація даних. FOREIGN KEY допомагає нормалізувати дані у декількох таблицях та зменшити надмірність. Це означає, що у базі даних може бути кілька таблиць, пов’язаних одна з одною.
Запобігання вставці некоректних даних. Якщо дві таблиці в базі даних пов’язані через поле (атрибут), використання FOREIGN KEY гарантує, що в це поле не будуть вставлені неправильні дані. Це допомагає усунути помилки на рівні бази даних.
FOREIGN KEY з оператором ALTER TABLE
Можна додати обмеження FOREIGN KEY до існуючої таблиці за допомогою оператора ALTER TABLE. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
CREATE TABLE Customers ( id INT, first_name VARCHAR(40), last_name VARCHAR(40), age INT, country VARCHAR(10), CONSTRAINT CustomersPK PRIMARY KEY (id) ); CREATE TABLE Orders ( order_id INT, item VARCHAR(40), amount INT, customer_id INT, CONSTRAINT OrdersPK PRIMARY KEY (order_id) ); -- Додаємо зовнішній ключ до поля customer_id. -- Зовнішній ключ посилається на поле id таблиці Customers ALTER TABLE Orders ADD FOREIGN KEY (customer_id) REFERENCES Customers(id); |
Декілька зовнішніх ключів у таблиці
Таблиця може мати декілька зовнішніх ключів. Припустимо, нам потрібно записати всі транзакції, де кожен користувач одночасно є покупцем та продавцем.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
-- Ця таблиця не має зовнішнього ключа CREATE TABLE Users ( id INT, first_name VARCHAR(40), last_name VARCHAR(40), age INT, country VARCHAR(10), CONSTRAINT CustomersPK PRIMARY KEY (id) ); -- Додаємо зовнішній ключ до полів buyer та seller. -- Зовнішній ключ посилається на поле id таблиці Users CREATE TABLE Transactions ( transaction_id INT, amount INT, seller INT REFERENCES Users(id), buyer INT REFERENCES Users(id), CONSTRAINT TransactionsPK PRIMARY KEY (transaction_id) ); |
Тут ми створюємо два зовнішні ключі (buyer та seller) у таблиці Transactions.
