未执行Oracle FK约束

问题描述:

我正在使用oracle 12c数据库并想测试出一个问题。未执行Oracle FK约束

执行Web服务请求时,它返回约束名称(YYY.FK_L_TILSYNSOBJEKT_BEGRENSNING)上的基础ORA-02292错误。 这里是约束表的SQL:

CONSTRAINT "FK_L_TILSYNSOBJEKT_BEGRENSNING" FOREIGN KEY ("BEGRENSNING") 
    REFERENCES "XXX"."BEGRENSNING" ("IDSTRING") DEFERRABLE INITIALLY DEFERRED ENABLE NOVALIDATE 

的问题是,当我试图从表中删除与有效IDSTRING手动行(两个表中) - 它成功地做它。

是什么导致它表现这种方式?是否有其他信息我应该给?

+2

请定义“成功做它”。我注意到你的约束是可延迟的,事实上最初是推迟的。 –

+0

@ErwinSmout - 好吧,它只是删除了这一行,但事实是我并不真正了解推迟行为。现在读一下 – Medardas

+2

“最初延迟”意味着只能在每个**事务结束时检查约束**,而不必在每个**语句**之后检查。这通常意味着你可以有'DELETE','INSERT','UPDATE'等,并且只有当你发出COMMIT(或者等价的,比如执行DDL语句或者断开会话)时才会检查约束。你是否说'DELETE'是“成功”的,因为它也幸免于'COMMIT'?那会很奇怪。 – mathguy

不知道它是否有助于某人,因为这是相当愚蠢的错误,但我会尽量让它有用,因为人们要求答案。

关键字DEFERRABLE INITIALLY DEFERRED意味着约束在强制执行承诺没有在查询运行时,而不是INITIALLY IMMEDIATE,它不发出查询后立即检查,但是这个关键字使得数据库批量更新有点慢(因为每一个查询在一个事务中必须通过约束来检查,同时如果事实证明存在一个问题 - 即整个批量被回滚,不会发出额外的不必要的查询并且可以对其进行处理),因此使用次数少于初始值尊重。

但是,错误ORA-02292仅显示DELETE语句,因为它知道它更容易调试您的语句。