Что произойдет с дочерней записью при удалении родительской, если внешний ключ определен без правила ON DELETE?

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

Ответ

Если правило ON DELETE не указано явно, поведение по умолчанию зависит от СУБД, но чаще всего оно эквивалентно ON DELETE NO ACTION (в некоторых СУБД, например, старых версиях MySQL, это мог быть RESTRICT).

ON DELETE NO ACTION означает:

  • Удаление записи из родительской таблицы будет запрещено, если на нее ссылается хотя бы одна запись из дочерней таблицы.
  • Операция завершится ошибкой нарушения целостности внешнего ключа.

Пример и результат:

CREATE TABLE departments (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(id) -- Правило ON DELETE не задано
);

INSERT INTO departments (id, name) VALUES (1, 'IT');
INSERT INTO employees (id, name, dept_id) VALUES (10, 'Alice', 1);

-- Эта команда ВЫЗОВЕТ ОШИБКУ:
DELETE FROM departments WHERE id = 1;
-- Ошибка: Cannot delete or update a parent row: a foreign key constraint fails

Чтобы удалить родительскую запись, необходимо сначала:

  1. Удалить или обновить (dept_id = NULL) все дочерние записи в employees.
  2. Либо изменить определение внешнего ключа, добавив ON DELETE CASCADE или ON DELETE SET NULL.