所以我有两个相互引用的实体,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
有唯一约束)
如果我将 child
的 fk 设置为 ON DELETE CASCADE
,看起来我可以删除该条目,但这似乎不是那个家伙的意思我的脖子想要,这是“如果你删除一个 parent
删除它的 child
,如果你删除一个 child
有一个 parent
,不要。
我如何实现这一目标?
最佳答案
使用 CTE 在一个语句中从两个表中删除:
WITH x AS (
DELETE FROM parent
WHERE ...
RETURNING id
)
DELETE FROM child
WHERE ...;
关于SQL - 如何删除两个相互引用的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57479792/