【问题标题】:oracle - integrity constraint violated - child record foundoracle - 违反完整性约束 - 找到子记录
【发布时间】:2012-06-18 17:39:55
【问题描述】:

我有一个巨大的 pl/sql 存储过程,只要插入,我们就会在其中进行一些删除。 程序以语句开始

 EXECUTE IMMEDIATE 'SET CONSTRAINTS ALL DEFERRED'

在最后的commit 语句中,我收到了 ORA-02292:违反了完整性约束 AAA。 问题是我不知道究竟是哪个语句导致它,因为我既从父表中删除(在子表之前),又在父表之前插入子表。 我试图用谷歌搜索它,但到处都说我只尝试删除时会发生 02292。

当我尝试在子表中插入值但父表中没有此条目时会发生此错误吗?

另外,02292 和 02291 有什么区别?

【问题讨论】:

  • 你有循环依赖吗?如果答案是否定的,那么只需按正确的顺序插入即可。如果你这样做了,为什么不一直推迟约束?在过程开始时执行此操作将表明您的架构/数据模型存在问题。
  • 是的,我知道这个数据模型有很大的问题(当然是其他人写的),但是之前没问题,现在开始失败了。所以我需要找出是什么原因造成的。是因为删除,还是特别是插入。

标签: database oracle plsql constraints


【解决方案1】:

ORA-02292 表明发生错误是因为 A) 约束没有指定 ON DELETE 子句,并且 B) 您从主表中删除了在子表中具有匹配引用的行。您的选择是修改约束以便使用 ON DELETE CASCADE 或确保在从主记录中删除之前删除所有子记录。我的偏好是添加 ON DELETE CASCADE 但我想可能有理由不这样做。见ORA-02292

ORA-02291 与此相反。如果您尝试在子表中插入一行,但约束中指定的新子行上的键字段值在主表中不存在,则会引发 ORA-02291。见ORA-02291

【讨论】:

    【解决方案2】:

    如果你想从名字中禁用约束来解决ORA-02292。

    1. 查找绑定到该约束的表名

      SELECT owner, table_name FROM dba_constraints WHERE constraint_name = '{CONSTRAINT_NAME}';

    2. 禁用约束(此命令应由管理员用户执行)

      ALTER TABLE {TABLE_NAME} DISABLE constraint {CONSTRAINT_NAME} cascade;

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 2017-05-17
      • 2019-03-16
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2019-08-06
      相关资源
      最近更新 更多