【问题标题】:SQL deletion of a row returning- "ORA-02292: integrity constraint (..) violated - child record found"SQL 删除行返回 - “ORA-02292:违反完整性约束 (..) - 找到子记录”
【发布时间】:2014-06-07 05:38:06
【问题描述】:

我有一个由四个表组成的数据库。关系架构如下图:

下面是行:

现在我正在尝试删除所有者 ID 为 OW1 的所有者。因为 id 是所有者表中的主键和其他表中的外键,所以它不允许我删除该行。这是我尝试过的 SQL:

 delete from owners
 where ownerid = 'OW1' and petid = 'PT1'

然后它返回:

ORA-02292: integrity constraint (TEST_1.ADDRESSES_OWNERS_FK) violated - child record found

而且我不允许在关系图中将删除规则设置为“CASCADE”。 请帮忙:(

【问题讨论】:

  • 不能删除,因为它是pets表上PT1的外键,也是contact和address表上的外键。您需要先删除这些记录
  • 能否删除所有者的联系人和地址中的条目,如 DELETE FROM contacts where ownerid = 'OW1';和 DELETE FROM 地址 where ownerid = 'OW1';?
  • @JosephB 是的,我可以。但我必须从所有者表中删除该条目。如果我可以在一个语句中删除它们,它仍然是可以接受的。我的意思是我知道我必须先删除宠物、联系人、地址中的外键,然后在所有者表中删除它,但必须在同一个语句中完成。
  • 我想尝试他们提到的类似here...只是不知道如何...
  • @envyM6 你可以禁用外键约束@​​987654322@

标签: sql database oracle11g


【解决方案1】:

有时,找出哪些子引用表拒绝从父表中删除数据是很乏味的。在这种情况下,我们可以使用此查询找到对主表的引用。

   select * from
       all_constraints where
            r_constraint_name in
                 (select  constraint_name from all_constraints
                  where table_name= '<PARENT_TABLE_NAME>');  

通过查看结果列表,可以轻松找到参考。如果需要,您可以从那里暂时禁用约束:

ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;

并在必要时重新启用它。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    好吧,如果一个匿名块算作一个语句,只需将您的删除操作包装在一个块中:

    begin
      delete from addresses where ownerid = 'OW1';
      delete from contacts where ownerid = 'OW1';
      delete from pets where ownerid = 'OW1';
      delete from owners where ownerid = 'OW1';
    end;
    /
    

    SQL Fiddle。好像有点作弊,但如果是给你的条件的话……

    【讨论】:

    • 您也可以禁用外键限制,但是,这也可以。
    • @MarshallTigerus - 是的,但那将是多个语句,我猜如果不能更改约束,那么它们也不能被禁用。但是,谁知道人为规则。 (虽然制作然后级联是危险的,所以也许这不是那么人为;如果它不是一次性系统,禁用它们也是危险的)。
    • 同意。有了这么多限制,它真的应该是一个活动/非活动标志系统,而不是删除东西
    • 谢谢让我试试 :)
    猜你喜欢
    • 2017-05-17
    • 2019-03-16
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2012-07-02
    • 2020-04-08
    • 2016-04-13
    • 2019-08-06
    相关资源
    最近更新 更多