Что такое внешний ключ (ForeignKey) в реляционной базе данных и какова его роль?

«Что такое внешний ключ (ForeignKey) в реляционной базе данных и какова его роль?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Внешний ключ (Foreign Key, FK) — это ограничение целостности в реляционной базе данных, которое обеспечивает ссылочную целостность между данными в двух таблицах. Оно связывает столбец (или группу столбцов) в одной таблице (дочерней) с первичным ключом (Primary Key, PK) или уникальным ключом в другой таблице (родительской).

Основная роль: Гарантировать, что каждое значение в столбце с внешним ключом соответствует существующей записи в родительской таблице, предотвращая появление "висячих" ссылок.

Синтаксис создания (SQL):

-- Родительская таблица
CREATE TABLE Customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

-- Дочерняя таблица с внешним ключом
CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    order_date DATE NOT NULL,
    customer_id INT,
    -- Определение внешнего ключа
    CONSTRAINT fk_order_customer 
        FOREIGN KEY (customer_id) 
        REFERENCES Customers(customer_id)
        ON DELETE CASCADE  -- Действие при удалении в родительской таблице
        ON UPDATE NO ACTION -- Действие при обновлении PK в родительской таблице
);

Ключевые аспекты внешнего ключа:

  • Ссылочные действия (Referential Actions): Определяют поведение при изменении или удалении записи в родительской таблице.
    • CASCADE: Удалить/обновить связанные записи в дочерней таблице.
    • SET NULL: Установить NULL в столбце внешнего ключа (если он допускает NULL).
    • RESTRICT / NO ACTION: Запретить операцию, если существуют зависимые записи.
    • SET DEFAULT: Установить значение по умолчанию.
  • Индексы: Во многих СУБД (MySQL, SQL Server) создание внешнего ключа автоматически создаёт индекс на столбцах дочерней таблицы, что ускоряет проверки целостности и операции JOIN. В других (PostgreSQL) индекс нужно создавать явно.
  • Составные внешние ключи: Можно ссылаться на составной первичный ключ.
    FOREIGN KEY (dept_id, project_id) REFERENCES Departments(id, project_id)
  • Проверка при операциях: Целостность проверяется при INSERT, UPDATE в дочерней таблице и при UPDATE/DELETE в родительской.

Практическое значение: Внешние ключи — фундамент для построения связей "один-ко-многим" и "многие-ко-многим" (через таблицу связи), что является основой нормализованной структуры базы данных.