没有外键约束的级联删除Postgresql

时间:2018-11-23 11:43:44

标签: sql postgresql foreign-keys cascading-deletes

我想在两个表之间设置级联删除而不强制执行参照完整性。

例如,假设我有以下两个表:

帖子
+----+---------+
| id | user_id |
+----+---------+
|  1 |       1 |
|  2 |       2 |
|  3 |       3 |
+----+---------+
使用者
+----+
| id |
+----+
|  1 |
|  4 |
+----+

我想创建一个约束/触发器,使我删除帖子中的行而不强制引用完整性时,会删除用户中的引用行。

1 个答案:

答案 0 :(得分:0)

您将需要一个触发器:

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();
相关问题