oracle - 违反完整性约束 - 找到子记录
Posted
技术标签:
【中文标题】oracle - 违反完整性约束 - 找到子记录【英文标题】:oracle - integrity constraint violated - child record found 【发布时间】:2012-06-18 17:39:55 【问题描述】:我有一个巨大的 pl/sql 存储过程,只要插入,我们就会在其中进行一些删除。 程序以语句开始
EXECUTE IMMEDIATE 'SET CONSTRAINTS ALL DEFERRED'
在最后的commit
语句中,我收到了 ORA-02292:违反了完整性约束 AAA。
问题是我不知道究竟是哪个语句导致它,因为我既从父表中删除(在子表之前),又在父表之前插入子表。
我试图用谷歌搜索它,但到处都说我只尝试删除时会发生 02292。
当我尝试在子表中插入值但父表中没有此条目时会发生此错误吗?
另外,02292 和 02291 有什么区别?
【问题讨论】:
你有循环依赖吗?如果答案是否定的,那么只需按正确的顺序插入即可。如果你这样做了,为什么不一直推迟约束?在过程开始时执行此操作将表明您的架构/数据模型存在问题。 是的,我知道这个数据模型有很大的问题(当然是其他人写的),但是之前没问题,现在开始失败了。所以我需要找出是什么原因造成的。是因为删除,还是特别是插入。 【参考方案1】:ORA-02292 表明发生错误是因为 A) 约束没有指定 ON DELETE 子句,并且 B) 您从主表中删除了在子表中具有匹配引用的行。您的选择是修改约束以便使用 ON DELETE CASCADE 或确保在从主记录中删除之前删除所有子记录。我的偏好是添加 ON DELETE CASCADE 但我想可能有理由不这样做。见ORA-02292。
ORA-02291 与此相反。如果您尝试在子表中插入一行,但约束中指定的新子行上的键字段值在主表中不存在,则会引发 ORA-02291。见ORA-02291。
【讨论】:
【参考方案2】:如果你想从名字中禁用约束来解决ORA-02292。
查找绑定到该约束的表名
SELECT owner, table_name FROM dba_constraints WHERE constraint_name = 'CONSTRAINT_NAME';
禁用约束(此命令应由管理员用户执行)
ALTER TABLE TABLE_NAME DISABLE constraint CONSTRAINT_NAME cascade;
【讨论】:
以上是关于oracle - 违反完整性约束 - 找到子记录的主要内容,如果未能解决你的问题,请参考以下文章
Oracle的ORA-02292报错:违反完整性约束,已找到子记录
Oracle的ORA-02292报错:违反完整性约束,已找到子记录
ora-02292:违反完整约束条件(XXX.FKXXX)- 已找到子记录
ORA-02292: 违反完整性约束 - 在 ORACLE SQL Developer 中创建过程时发现子记录?