2012-02-15 61 views
2

您好我想從Excel表插入到SQL數據庫在Java中的值。 SQL數據庫已經通過一些其他技術插入了一些行。現在我需要從Excel工作表中插入新行,並應該消除數據庫和Excel表中存在的重複值。爲此,我寫了一個像這樣的查詢。刪除重複的值,而插入

首先我插入從excelsheet記錄到SQL數據庫使用插入查詢

Statement.executeUpdate(("INSERT INTO dbo.Company(CName,DateTimeCreated) values 
    ('"+Cname」' ,'"+ts+"'); 

後來我使用刪除查詢刪除重複值。

 String comprows="delete from dbo.Company where Id not in" 
       + "(select min(Id) from dbo.Company " 
       + "group by CName having count(*)>=1)"; 
      statement3.executeUpdate(comprows); 

其中id是autoincreated整數。 但是插入然後刪除不好。 我如何知道這些值已經存在?如果存在,插入時如何刪除?

+0

什麼RDBMS?如果你的RDBMS支持它,一個臨時表+ MERGE是一個選項 – 2012-02-15 04:35:52

回答

2

您可以簡單地爲CName首先發射SELECT。如果找到記錄,則更新插入新記錄。 編輯補充代碼片段:

ResultSet rs = Statement.query("SELECT Id from dbo.Company where CNAME = '" +Cname + "'"); 

if(rs.next()) { 
    // retrieve ID from rs 
    // fire an update for this ID 
} else { 
    // insert a new record. 
} 

或者,如果你認爲已經有複製你的桌子上,你想刪除它們以及..

當然
ResultSet rs = Statement.query("SELECT Id from dbo.Company where CNAME = '"+Cname + "'"); 

List idList = new ArrayList(); 
while(rs.next()) { 
    // collect IDs from rs in a collection say idList 
} 
if(!isList.isempty()) { 
    //convert the list to a comma seperated string say idsStr 
    Statement.executeUpdate("DELETE FROM dbo.Company where id in ("+ idsStr + ")"); 
} 
// insert a new record. 
Statement.executeUpdate(("INSERT INTO dbo.Company(CName,DateTimeCreated) values('"+Cname」' ,'"+ts+"'); 

中好的做法是,使用PreparedStatement可以提高性能。 PS:對不起,我有任何語法錯誤。

+0

hmmm你能提供代碼片段嗎?我沒有得到清晰的圖片。 – user1193904 2012-02-15 05:02:27

0

一個選項是創建一個臨時表並將您的Excel數據轉儲到那裏。然後,您可以編寫一個將臨時表與dbo.Company表連接的插入,並只插入那些尚未存在的記錄。

你可以在你想要插入的每條記錄上查找,但是如果你處理的是大容量,這不是一種超高效的方法,因爲你必須爲你中的每條記錄做一個select和insert操作。電子表格。

合併報表在這些類型的情況下也非常有效。我不認爲所有的數據庫都支持它們(我知道Oracle確實如此)。合併語句基本上是一個組合插入和更新,因此您可以查找最終表並插入,如果未找到並更新(如果找到)。關於這一點的好處在於,您可以一次完成所有這一切而不是一個記錄,從而獲得效率。

0

如果您可以控制數據庫模式,則可以考慮爲任何列設置一個唯一的限制,以避免重複。當你插入時,它會在試圖添加dup數據時拋出。趕在它把你全部拋出之前抓住它。

在DB本身上強制執行這樣的約束通常是很好的;這意味着沒有人查詢數據庫必須擔心無效重複。此外,樂觀地嘗試插入第一(不先做一個單獨的選擇)可能會更快。