问题:如何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触发器,如果没有剩余子表,则删除父行。它可能容易出现并发INSERTs 的竞争条件;您需要SELECT ... FOR UPDATE父记录,then 检查其他子记录。插入时的外键检查对引用的(父)记录进行FOR SHARE锁定,这样可以防止任何竞争条件。

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐