2011-09-20 78 views
2

我想將數據插入數據庫到不同的表中。由於約束條件,我必須按照特定的順序進行此操作。這意味着,首先插入表a,然後b,然後c,....並且不混合表格。 但我正在編寫一個程序,它獲得多個csv文件,並應將它們導入到數據庫中,但程序無法知道什麼是正確的順序。所以我認爲交易是正確的方式,因爲我聽說,數據一致性必須只存在於交易結束時。但是,這並不適用Java Oracle Transaction

我的代碼看起來像這樣:

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(完整性約束違反):-(

+1

如果你使用一個事務,你仍然需要插入正確的順序 – Janco

回答

8

你需要使約束可延遲,這種方式直到提交纔會被檢查。 here

> 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. 
+0

我也在通過addbatch()刪除時遇到此問題。首先添加DELETE sql子記錄,然後爲父記錄添加DELETE sql。這是造成如何在不使用CONSTRAINTS = DEFER的情況下解決此問題?爲什麼這個Addbatch沒有按照與SQL相同的順序進行操作?請幫忙。 –

-2

交易不會幫你你可以嘗試禁用必要的約束,插入你的數據,然後再次啓用約束條件

+0

我真的不建議禁用DB約束,然後插入數據。在所有數據庫約束完全確保數據完整性之後。禁用它們將是非常危險的。如果數據不好並且不能再次啓用會怎麼樣?讓它們延期(恕我直言)會是一個更好的解決方案。 – Ollie