SQL删除的行返回-“ ORA-02292:违反完整性约束(..)-找到子记录”

env*_*yM6 4 sql database oracle11g

我有一个包含四个表的数据库。图中的关系架构如下:

在此处输入图片说明

以下是这些行:

在此处输入图片说明

现在,我正在尝试删除具有所有者ID的所有者OW1。由于id是所有者表中的主键,而其他表中的外键则不允许我删除该行。这是我尝试的SQL:

 delete from owners
 where ownerid = 'OW1' and petid = 'PT1'
Run Code Online (Sandbox Code Playgroud)

它返回:

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

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

Ale*_*ole 5

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

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;
/
Run Code Online (Sandbox Code Playgroud)

SQL小提琴。似乎有点作弊,但是如果满足了这些条件,那么...


Che*_*han 5

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

   select * from
       all_constraints where
            r_constraint_name in
                 (select  constraint_name from all_constraints
                  where table_name= '<PARENT_TABLE_NAME>');  
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;
Run Code Online (Sandbox Code Playgroud)

并在必要时重新启用它。希望这可以帮助。