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

标签 sql postgresql foreign-keys constraints

所以我有两个相互引用的实体,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 有唯一约束)

如果我将 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/

相关文章:

POSTGRESQL:批量输入 0 SELECT

php - MySQL 外键约束失败

java - 获取Key SQLite Android

清除缓存后SQL Server查询速度快

sql - 将带有重复项的 MySQL 表迁移到带有 UNIQUE 约束的另一个表的最佳方法

sql - 仅使用否定项进行 SQLite MATCH

c# - 水平显示数据库列数据

PostgreSQL 多列唯一约束导致错误

postgresql - 表名作为 PostgreSQL 函数参数/错误 : column ".." does not exist

php - 3张表外键连接