如何CASCADE从子表删除到父表?
·
问题:如何CASCADE从子表删除到父表?
我准备了一个 fiddle 来演示问题。
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';
这应该级联到父表并删除记录。
解答
外键只在另一个方向起作用:从父级到子级级联删除,因此当父(引用)记录被删除时,任何子(引用)记录也被删除。
如果是 1:1 关系,可以创建双向外键关系,一侧为DEFERRABLE INITIALLY DEFERRED
,两侧为级联。
否则,您将需要子表上的ON DELETE ... FOR EACH ROW
触发器,如果没有剩余子表,则删除父行。它可能容易出现并发INSERT
s 的竞争条件;您需要SELECT ... FOR UPDATE
父记录,then 检查其他子记录。插入时的外键检查对引用的(父)记录进行FOR SHARE
锁定,这样可以防止任何竞争条件。
更多推荐
所有评论(0)