Какое поведение по умолчанию при удалении записи, на которую ссылается внешний ключ в PostgreSQL?

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

Ответ

В PostgreSQL, если при создании внешнего ключа не указано действие ON DELETE явно, по умолчанию применяется NO ACTION. Это предотвращает удаление записи в родительской таблице, если на неё существуют ссылки в дочерней.

Пример с поведением по умолчанию:

CREATE TABLE authors (
    id SERIAL PRIMARY KEY,
    name TEXT
);

CREATE TABLE books (
    id SERIAL PRIMARY KEY,
    author_id INTEGER REFERENCES authors(id) -- Подразумевается ON DELETE NO ACTION
);
-- DELETE FROM authors WHERE id = 1; -- Вызовет ошибку, если у автора есть книги.

Важное отличие от RESTRICT: В PostgreSQL NO ACTION и RESTRICT схожи, но NO ACTION проверяет ограничение в конце операции (отложенная проверка, если транзакция не завершена), а RESTRICT — немедленно. На практике при DELETE без отложенных ограничений разницы нет.