如何级联从子表到父表的删除?

问题描述

外键仅在另一个方向上起作用:从父级到子级级联删除,因此,当删除父级(引用)记录时,所有子级(引用)记录也会被删除

如果是1:1关系,则可以创建双向外键关系,其中一侧为DEFERRABLE INITIALLY DEFERRED,而两侧均为级联。

否则,您将需要ON DELETE ... FOR EACH ROW在子表上创建一个触发器,以在没有剩余子级时删除父行。并发INSERTs可能会导致竞争条件;您需要SELECT ... FOR UPDATE父记录, 然后 检查其他子记录。插入时的外键检查会FOR SHARE锁定引用的(父)记录,因此应防止出现任何争用情况。

解决方法

我准备了一个 小提琴 来演示这个问题

CREATE TABLE parent (
   parent_id integer primary key
);

CREATE TABLE child (
   child_name TEXT primary key,parent_id integer REFERENCES parent (parent_id) ON DELETE CASCADE
);

INSERT INTO parent VALUES (1);
INSERT INTO child VALUES ('michael',1),('vanessa',1);

我想要一种在删除子记录时将其删除到CASCADE到父记录的方法。
例如:

DELETE FROM child WHERE child_name='michael';

这应该级联到父表并删除记录。