我想在两个表之间设置级联删除而不强制执行参照完整性。
例如,假设我有以下两个表:
帖子+----+---------+
| id | user_id |
+----+---------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+---------+
使用者
+----+
| id |
+----+
| 1 |
| 4 |
+----+
我想创建一个约束/触发器,使我删除帖子中的行而不强制引用完整性时,会删除用户中的引用行。
答案 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();