oracle - 违反完整性约束 - 找到子记录

时间:2012-06-15 15:58:56

标签: database oracle plsql constraints

我有一个庞大的pl / sql存储过程,只要插入就会进行一些删除操作。 过程以语句

开头
 EXECUTE IMMEDIATE 'SET CONSTRAINTS ALL DEFERRED'

在最后commit语句中,我收到了ORA-02292:违反了完整性约束AAA。 问题是我不知道哪个语句确切地导致它,因为我从父表中删除(在子1之前)和插入父表之前的子表。 我试图谷歌它,但到处都说,当我试图删除时,02292就会发生。

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

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

2 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

如果要从名称中禁用约束以解决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;