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”。请帮忙 :(
好吧,如果匿名块算作一条语句,只需将删除内容包装在一个块中:
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小提琴。似乎有点作弊,但是如果满足了这些条件,那么...
有时,找出哪些子引用表拒绝从父表中删除数据很乏味。在这种情况下,我们可以使用此查询找到对主表的引用。
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)
并在必要时重新启用它。希望这可以帮助。