PostgreSQL ON DELETE CASCADE и SET NULL: выбрать поведение FK

Категория: Postgresql · Язык: SQL · Обновлено:

Действие ON DELETE задаёт, что произойдёт с дочерними строками при удалении родителя. CASCADE удалит зависимые строки, а SET NULL сохранит их и очистит ссылку. ??????? ????????? ?????? ?? ????????? ??????? ? ??????? ???? ?????????? ?? ????? ??????.

Рабочий пример

SQL
CREATE TEMP TABLE teams(id int primary key);
CREATE TEMP TABLE members(
  id int primary key,
  team_id int references teams(id) ON DELETE SET NULL
);
INSERT INTO teams VALUES (1);
INSERT INTO members VALUES (7, 1);
DELETE FROM teams WHERE id = 1;
SELECT id, team_id FROM members;

CASCADE уместен для зависимых деталей, которые не имеют смысла без родителя. SET NULL подходит для необязательной связи и требует nullable foreign key.

Частый вопрос

Как оставить строку, но запретить удаление родителя?

Используйте RESTRICT или NO ACTION. Удаление родителя завершится ошибкой, пока существуют дочерние ссылки.