我有一个oracle(11)数据库,它的表具有自引用约束。
我有一些非常糟糕的java代码,已经愉快地运行了很长时间,它创建了一批两个插入并运行它们。这部分是我们单元测试代码的一部分,并且已经愉快地运行了多年。
奇怪的是,子对象的insert在父对象的insert之前被添加到批处理中。
我本以为那是行不通的。但确实如此
好吧,它可以在我原来的数据库上运行,但不能在新的“副本”上运行。
我的table是这样的:
create table my_table (primary_key_id INT not null, related_id INT null);
alter table my_table add primary key (primary_key_id);
create index fk_my_table on my_table (related_id);
ALTER TABLE my_table ADD CONSTRAINT fkc_my_table FOREIGN KEY (related_id) REFERENCES my_table (primary_key_id);
java代码如下:
public void wossupDoc(Connection con) throws Exception {
String sql = "INSERT INTO my_table (primary_key_id, related_id) values (?,?)";
try(PreparedStatement ps = con.prepareStatement(sql)){
ps.setLong(1, 100);
ps.setLong(2, 101);
ps.addBatch();
ps.setLong(1, 101);
ps.setNull(2, Types.NUMERIC);
ps.addBatch();
ps.executeBatch();
}
(我创建了那个表,并将这个java代码放入一个单元测试中,就像这样,这样我就可以针对不同的数据库重复运行它)
因此,当对数据库“a”运行时,此代码有效,但对数据库“b”运行时不起作用。所以,这是相同的代码,相同的jdbc驱动程序,但是数据库连接属性中的url不同。。。是的,它总是autocommit=false。
我已经确认,在它工作的场景中,数据库表中有两条记录。
这些数据库是由两个不同的DBA相隔数年创建的,它们几乎完全相同。。。但在某种程度上明显不同。
数据库版本:oracle database 11g版本11.2.0.3.0-64位生产oracle database 11g版本11.2.0.4.0-64位生产
(是的,我知道这些都是非常旧的版本,我正在尝试将我们的代码迁移到oracle 19数据库,这就是我发现这种情况的原因)
有人知道为什么会这样吗?是否有一个数据库/连接参数我可以调整它打开或关闭??
我真正的问题是,我想知道在主应用程序中是否有任何“批处理”代码可能尝试这样做,因此在过去几年中一直在意外地工作;我不知道,直到我们开始使用新的数据库,用户开始做一些事情。。。
暂无答案!
目前还没有任何答案,快来回答吧!