oracle - sql - Oracle:何時檢查約束?

在我的理解中,一般應該在事務結束時檢查約束。


begin



 insert into B (P, F)


 values (1, 1);


 insert into A (P)


 values (1);



 commit;


end;



但是,Oracle提供了錯誤(德語):


[23000][2291] ORA-02291: Integritäts-Constraint (DATABASE.AB_constraint) verletzt - übergeordneter Schlüssel nicht gefunden


ORA-06512: in Zeile 3


Position: 0



違反完整性約束-找不到引用的鍵。如果我逆轉命令


begin



 insert into A (P)


 values (1);


 insert into B (P, F)


 values (1, 1);



 commit;


end;



它可以正常工作,約束在Oracle事務結束時是否沒有被驗證?如果是這樣,有沒有辦法強制這種行為?

时间: 作者:

這稱為延遲約束。


alter table some_table


 add constraint fk_something 


 foreign key (some_column) references other_table(pk_column)


 deferrable initially deferred;



作者:

解決此問題的一種方法是,推遲相關約束,例如:


begin


 execute immediate 'set constraint ab_constraint deferred';


 insert into B (P, F) values (1, 1);


 insert into A (P) values (1);


 execute immediate 'set constraint ab_constraint immediate';


 commit;


end;



作者:

除非將約束顯式定義為延遲約束,否則在將行插入到表中時將檢查約束。

作者:
...