2014-09-19 61 views
0

我正在實現從一個數據庫到另一個數據庫的應用程序特定數據導入功能。將CSV文件讀取並連接到數據庫中

我有一個包含10000行的CSV文件。這些行需要插入/更新到數據庫中。

我使用mysql數據庫並從Java插入。

有可能是這種情況,在數據庫中可能存在兩行,這意味着需要更新這些行。如果不存在於數據庫中,則需要插入。

一個可能的解決方案是,我可以逐行閱讀,檢查數據庫中的條目並相應地構建插入/更新查詢。但是這個過程可能需要很長時間來創建更新/插入查詢並在數據庫中執行它們。有時候我的CSV文件可能有數百萬條記錄。

是否有任何其他更快的方法來實現這個功能嗎?

+1

有關性能,您可以考慮使用LOAD DATA INFILE和REPLACE選項,請參閱[LOAD DATA INFILE語法](http://dev.mysql.com/doc/refman/5.6/en/load-data。html) – VMai 2014-09-19 13:12:19

回答

0

在SQL中添加一個用於插入的存儲過程。在存儲過程中使用try catch塊來執行插入操作。如果插入失敗,請進行更新。然後你可以簡單地從你的程序調用這個方法。

或者:

UPDATE Table1 SET (...) WHERE Column1='SomeValue' 
IF @@ROWCOUNT=0 
    INSERT INTO Table1 VALUES (...) 
+0

如果有任何其他方式沒有程序 – 2014-09-19 11:44:43

+0

我更新了答案。我想如果你使用的是實體,那麼就有內置的功能。否則上述2種方法工作。請注意,如果您有多個客戶端讀取和寫入,則兩種方法都可能失敗,除非您將其鎖定。 – VoteCoffee 2014-09-19 11:51:36

+0

http://stackoverflow.com/questions/108403/solutions-for-insert-or-update-on-sql-server有更好的答案更強大的解決方案 – VoteCoffee 2014-09-19 11:53:18

0

你需要在一段時間經常或只是一次做到這一點? 我需要不時加載csv文件到數據庫進行分析,並且我創建了一個帶有數據流任務的SSIS數據解決方案,該任務將csv-File加載到SQL Server上的表中。

欲瞭解更多的相關信息看這個博客 http://blog.sqlauthority.com/2011/05/12/sql-server-import-csv-file-into-database-table-using-ssis/

+0

您發佈的偉大的文章,但我想插入和更新csv到MySQL數據庫使用Java – 2014-09-19 11:52:58

1

我不知道你如何判斷「已經存在」,但如果它是任何類型的數據庫級別的約束(可能在主鍵上?),你可以使用REPLACE INTO語句,該語句將創建一條記錄,除非出現錯誤,在這種情況下,它將更新阻止其被插入的記錄。

它的工作原理就像INSERT基本上是:

REPLACE INTO table (id, field1, field2) 
VALUES (1, 'value1', 'value'2) 

如果行ID爲1存在,它與這些值更新;否則它被創建。

1

鑑於您正在使用MySQL,您可以使用INSERT ... ON DUPLICATE KEY UPDATE ...語句,其功能與SQL標準MERGE語句類似。 MYSQL doc reference heregeneral Wikipedia reference to SQL MERGE functionality here。聲明看起來是這樣的

INSERT INTO MY_TABLE 
    (PRIMARY_KEY_COL, COL2, COL3, COL4) 
VALUES 
    (1, 2, 3, 4) 
ON DUPLICATE KEY 
    UPDATE COL2 = 2, 
     COL3 = 3, 
     COL4 = 4 

在這個例子中,我假設PRIMARY_KEY_COL是MY_TABLE主要或唯一鍵。如果INSERT語句由於主鍵或唯一鍵上的重複值而失敗,則執行UPDATE子句。還請注意(在MySQL doc page上)InnoDB表中有一些與自動增量列關聯的問題。

分享和享受。

相關問題