Внешний ключ (Foreign Key, FK) — это механизм обеспечения ссылочной целостности в реляционных базах данных, который создаёт отношение между двумя таблицами. Внешний ключ в одной таблице ссылается на первичный ключ (или уникальный ключ) в другой таблице, устанавливая логическую связь между ними.
Связь между таблицами
FK создаёт отношение "родитель-потомок" между таблицами.
Обеспечение целостности
Гарантирует, что данные в связанных таблицах остаются согласованными.
Ограничения действий
Определяет поведение при удалении или обновлении родительской записи.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
ALTER TABLE order_items
ADD CONSTRAINT fk_order
FOREIGN KEY (order_id) REFERENCES orders(order_id);
NO ACTION (по умолчанию)
Запрещает удаление/изменение родительской записи, если есть ссылающиеся дочерние записи.
CASCADE
Автоматически удаляет/обновляет дочерние записи при изменении родительской.
FOREIGN KEY (dept_id) REFERENCES departments(dept_id) ON DELETE CASCADE
SET NULL
Устанавливает NULL в FK при удалении родительской записи (столбец должен допускать NULL).
FOREIGN KEY (manager_id) REFERENCES employees(emp_id) ON DELETE SET NULL
SET DEFAULT
Устанавливает значение по умолчанию для FK при изменении родительской записи.
RESTRICT
Аналогичен NO ACTION, но проверка выполняется сразу.
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(100),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE courses (
course_id INT PRIMARY KEY,
title VARCHAR(100)
);
CREATE TABLE student_courses (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
В разных СУБД используются различные системные представления:
MySQL:
SELECT * FROM information_schema.REFERENTIAL_CONSTRAINTS;
SQL Server:
SELECT * FROM sys.foreign_keys;
PostgreSQL:
SELECT * FROM information_schema.table_constraints
WHERE constraint_type = 'FOREIGN KEY';
Типы данных должны совпадать
Тип FK должен точно соответствовать типу PK, включая размерность.
Производительность
FK создаёт дополнительные проверки, что может влиять на скорость операций DML.
Каскадные операции
ON DELETE CASCADE может быть опасным при непродуманном проектировании.
Отложенные проверки
Некоторые СУБД поддерживают отложенную проверку ограничений (DEFERRABLE).
Резюмируем: внешний ключ — это важнейший инструмент поддержания ссылочной целостности данных, который обеспечивает логические связи между таблицами и защищает от появления "висящих" ссылок. Правильное использование FK значительно повышает надёжность и согласованность данных в реляционной базе.