所以,我有两个实体引用对方parent,child。
parent
child
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)
parent.code
看起来如果我将childfk设置为ON DELETE CASCADE,我可以删除该条目,但是这似乎并不是我呼吸的那个家伙想要的,这就是“如果您删除了parent它child,也删除了它,如果您删除了child那个有一个parent,不要”。
ON DELETE CASCADE
我该如何实现?
使用CTE在一条语句中从两个表中删除:
WITH x AS ( DELETE FROM parent WHERE ... RETURNING id ) DELETE FROM child WHERE ...;