PostgreSQL ON DELETE CASCADE и SET NULL: выбрать поведение FK
Действие ON DELETE задаёт, что произойдёт с дочерними строками при удалении родителя. CASCADE удалит зависимые строки, а SET NULL сохранит их и очистит ссылку. ??????? ????????? ?????? ?? ????????? ??????? ? ??????? ???? ?????????? ?? ????? ??????.
Рабочий пример
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. Удаление родителя завершится ошибкой, пока существуют дочерние ссылки.