2013-10-04 69 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