2013-10-04 78 views
2

我以前我的Oracle事務內執行SET CONSTRAINTS ALL DEFERRED,但只要我打電話insertRow從配置爲TYPE_SCROLL_INSENSITIVECONCUR_UPDATABLE一個PreparedStatement獲得ResultSet,我仍然獲得了java.sql.SQLIntegrityConstraintViolationExceptionORA-02291 :違反完整性約束)。甲骨文JDBC忽略SET約束的遞延在CONCUR_UPDATABLE ResultSet中

這是一個帶有「自我」外鍵約束的表(它表示一個圖,特別是一棵樹),所以當我稍後插入一行後面時,實際上應該滿足該約束。

爲什麼SET CONSTRAINTS ALL DEFERRED顯然被忽略了,我能做些什麼呢?

+0

@MaVRoSCy這沒有任何意義。你的意思是插入的行的FK。但是,這是SET CONSTRAINTS ALL DEFERRED語句應該禁用的檢查。 –

+3

是您創建爲'DEFERRABLE'的約束嗎?你可以使用這個sql來檢查它'SELECT constraint_name,table_name,DEFERRABLE FROM all_constraints WHERE owner ='myschema' AND table_name ='THE_TABLE';' – MaVRoSCy

+0

如果不是,那麼SET CONSTRAINTS ALL DEFERRED將不會有任何效果 – MaVRoSCy

回答

3

問題是您的約束不是DEFERRABLE。你可以用一下:

SELECT constraint_name, table_name, DEFERRABLE 
FROM all_constraints 
WHERE owner = 'myschema' 
    AND table_name = 'THE_TABLE'; 

如果約束不創建爲DEFERRED然後SET CONSTRAINTS ALL DEFERRED是不會有任何效果。

解決方案:重新創建約束爲DEFERRED

+0

它應該創建爲「DEFERRABLE」嗎? – yunandtidus