Каскадное удаление без ограничения внешнего ключа Postgresql - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу настроить каскадное удаление между двумя таблицами без применения ссылочной целостности.

Например, представьте, что у меня есть следующие две таблицы:

публикаций
+----+---------+
| id | user_id |
+----+---------+
|  1 |       1 |
|  2 |       2 |
|  3 |       3 |
+----+---------+
пользователей
+----+
| id |
+----+
|  1 |
|  4 |
+----+

Я хочу создать ограничение / триггер, который приводит к удалению ссылочной строки в пользователях при удалении строки в публикациях без применения ссылочной целостности.

1 Ответ

0 голосов
/ 23 ноября 2018

Для этого вам понадобится триггер:

create function delete_users()
  returns trigger
as '
begin
   delete from users where id = old.user_id;
   return null;
end;
' language plpgsql;

create trigger trg_delete_users
  after delete on posts
  for each row execute procedure delete_users();

Онлайн пример: https://rextester.com/MJFCW22289

Если вы используете Postgres 10 или новее, триггер уровня оператора может работать быстрее:

create function delete_users()
  returns trigger
as $trg$
begin
   delete from users where id = (select user_id from old_table);
   return null;
end;
$trg$
language plpgsql;

create trigger trg_delete_users
  after delete on posts
  referencing old table as old_table
  for each statement 
  execute procedure delete_users();
...