Удаляется ли запись из дочерней таблицы автоматически при удалении связанной записи из родительской таблицы?

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

Ответ

Нет, по умолчанию удаление запрещено. При попытке удалить запись из родительской таблицы, на которую существуют ссылки, СУБД выбросит ошибку нарушения внешнего ключа (например, IntegrityConstraintViolationException).

Поведение управляется правилом ON DELETE:

CREATE TABLE orders (
    id INT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id)
        REFERENCES customers(id)
        ON DELETE CASCADE  -- Определяет действие при удалении
);

Основные варианты ON DELETE:

  • RESTRICT / NO ACTION (по умолчанию) — Запрещает удаление родительской записи, если существуют зависимые дочерние записи.
  • CASCADE — Автоматически удаляет все связанные дочерние записи. Опасен, может привести к каскадному удалению большого объема данных.
  • SET NULL — Устанавливает значение внешнего ключа в дочерней таблице в NULL (поле должно быть nullable).
  • SET DEFAULT — Устанавливает значение внешнего ключа в значение по умолчанию.