当前位置: 首页 > 面试题库 >

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

周涵畅
2023-03-14
问题内容

所以,我有两个实体引用对方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,不要”。

我该如何实现?


问题答案:

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

WITH x AS (
    DELETE FROM parent
    WHERE ...
    RETURNING id
)
DELETE FROM child
WHERE ...;


 类似资料:
  • 有时候在设计数据结构的时候,可能会遇到两个类需要相互引用的情形。比如类A有类型为B的成员,而类B又有类型为A的成员。 那么这种情形下,两个类的设计上需要注意什么呢? 同一文件 尝试方案 将A和B的定义都放在一个文件中,例如: #include <iostream> class A { public: A() { aa_ = 'A'; } char aa_;

  • 我有两个类,一个被设计用来包含另一个 然而,我不能相互引用类类型(和),只能是其中之一。 我怎样才能在彼此之间引用这两个类类型呢?否则最好的方法是什么?

  • 问题内容: 在此系统中,我们存储产品,产品图像(产品可能有很多图像)和产品的默认图像。数据库: 如您所见,和,是循环参考。可以吗 问题答案: 不,那不行。表之间的循环引用是混乱的。请参阅这篇(已有十年的历史)文章:SQL By Design:循环参考 一些DBMS可以特别小心地处理这些问题,但是MySQL会遇到问题。 作为您的设计,第一选择是使两个FK之一为可空。这使您能够解决“鸡与蛋”问题(我应

  • 问题内容: 我有两个表: 两个表中的item_id值相同-但我从“清单”表中删除并删除了清单,但没有删除“图像”表中的相应行。 所以-如果IMAGES中的item_id与我的主“列表”表中的任何最新item_id值都不对应,我想删除第二个“图像”表中的所有行。 如何删除“图像”表中未从“列表”中引用的所有记录? 我一直在尝试这样的SQL脚本和子查询: 但是,在我将其全部拧紧之前,是否想确认这是否正

  • 我有以下情况: 我有两个JVM进程(实际上是两个单独运行的java进程,而不是两个线程)在本地机器上运行。让我们把它们称为进程A和进程B。 我希望他们彼此通信(交换数据)(例如,ProcessA向ProcessB发送消息以执行某些操作)。 现在,我通过编写一个临时文件来解决这个问题,这些过程会定期扫描该文件以获取消息。我认为这个解决方案不太好。 什么是实现我想要的更好的选择?

  • 问题内容: 我有两个表,并且如果第二个表中存在行的确切副本,则需要从第一个表中删除行。 有没有人举过我如何在MSSQL Server中执行此操作的示例? 问题答案: 好吧,在某个时候,您将必须检查所有列-可能还需要加入… 应该可以做到……还有,但是这只会有所 帮助 -您仍然需要检查实际值以防止哈希冲突。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。