一尘不染

SQL-如何删除互相引用的两个实体

sql

所以,我有两个实体引用对方parentchild

child如果parent已删除,则必须将其删除,但在仍有parent引用的情况下不能删除。

这是我得到的两个约束:

ALTER TABLE public.parent
  ADD CONSTRAINT parent__child_id__fk
    FOREIGN KEY (child_id) REFERENCES child(id)
    ON DELETE CASCADE
;

ALTER TABLE public.child
  ADD CONSTRAINT child__parent_code__id__fk
    FOREIGN KEY (parent_code, id) REFERENCES parent(code, child_id)
      ON UPDATE CASCADE
      ON DELETE RESTRICT
    DEFERRABLE INITIALLY DEFERRED
;

我现在要删除一个parent(和相应的child)…

SQL Error [23503]:
ERROR: update or delete on table "parent" violates foreign key constraint
"child__parent_code__id__fk" on table "child"

    Detail: Key (code, child_id)=(A0B7EBF6-3_DELETE_ME, 10)
            is still referenced from table "child".

呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜…

是的,我正在尝试删除的血腥条目引用了它…

(我知道这是因为上有一个唯一的约束parent.code

看起来如果我将childfk设置为ON DELETE CASCADE,我可以删除该条目,但是这似乎并不是我呼吸的那个家伙想要的,这就是“如果您删除了parentchild,也删除了它,如果您删除了child那个有一个parent,不要”。

我该如何实现?


阅读 232

收藏
2021-03-08

共1个答案

一尘不染

使用CTE在一条语句中从两个表中删除:

WITH x AS (
    DELETE FROM parent
    WHERE ...
    RETURNING id
)
DELETE FROM child
WHERE ...;
2021-03-08