Java Oracle事务

Java Oracle事务,java,oracle,jdbc,transactions,Java,Oracle,Jdbc,Transactions,我想将数据插入到数据库的不同表中。由于限制,我必须按照特定的顺序来做。这意味着,首先插入表a,然后插入b,然后插入c。。。。不要把桌子混在一起。 但是我正在写一个程序,它可以得到多个csv文件,应该将它们导入数据库,但是程序不知道正确的顺序。所以我认为事务将是正确的方式,因为我听说,数据一致性必须只存在于事务的末尾。但这不起作用 我的代码如下所示: Connection connection = DriverManager.getConnection(url, user, pw); connec

我想将数据插入到数据库的不同表中。由于限制,我必须按照特定的顺序来做。这意味着,首先插入表a,然后插入b,然后插入c。。。。不要把桌子混在一起。 但是我正在写一个程序,它可以得到多个csv文件,应该将它们导入数据库,但是程序不知道正确的顺序。所以我认为事务将是正确的方式,因为我听说,数据一致性必须只存在于事务的末尾。但这不起作用

我的代码如下所示:

Connection connection = DriverManager.getConnection(url, user, pw);
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
statement.addBatch("INSERT INTO c ....");
statement.addBatch("INSERT INTO a ....");
statement.addBatch("INSERT INTO b ....");
statement.addBatch("INSERT INTO a ....");
// ...
statement.executeBatch();
statement.close();
connection.commit();

但我会得到ORA-02291(完整性约束冲突):-(

事务无法帮助您解决该问题。您可以尝试禁用必要的约束,插入数据,然后再次启用约束。

您需要使约束可延迟,这样在提交之前不会检查约束。有一篇很好的文章


如果您使用事务,您仍然需要以正确的顺序插入。我真的不建议禁用DB约束,然后再插入数据。在所有DB约束都存在之后,确实是为了确保数据完整性。禁用它们将非常危险。如果数据不好,并且无法再次启用,该怎么办?将它们设置为可延迟(IMHO)这是一个更好的解决方案。通过addbatch()删除时,我也会遇到这个问题。先添加子记录的删除sql,然后添加父记录的删除sql。这导致如何在没有约束的情况下解决此问题=延迟?为什么此addbatch的执行顺序与添加到其中的sql不同?请帮助。
> drop table c
table C dropped.
> drop table p
table P dropped.
> create table p (id number primary key)
table P created.
> create table c (id number primary key, p_id number)
table C created.
> alter table c add constraint pk_p foreign key (p_id) references p (id) deferrable
table C altered.
> insert into c values ( 1, 1 )
1 rows inserted.
> insert into p values ( 1 )
1 rows inserted.
> commit
commited.