问题描述
外键仅在另一个方向上起作用:从父级到子级级联删除,因此,当删除父级(引用)记录时,所有子级(引用)记录也会被删除。
如果是1:1关系,则可以创建双向外键关系,其中一侧为DEFERRABLE INITIALLY DEFERRED
,而两侧均为级联。
否则,您将需要ON DELETE ... FOR EACH
ROW
在子表上创建一个触发器,以在没有剩余子级时删除父行。并发INSERT
s可能会导致竞争条件;您需要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';
这应该级联到父表并删除记录。