6

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

 EXECUTE IMMEDIATE 'SET CONSTRAINTS ALL DEFERRED'

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

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

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

4

2 回答 2

13

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

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

于 2012-06-15T18:41:31.463 回答
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;

于 2017-01-27T11:00:38.487 回答