2012-12-13 20 views
0

我想通過從Java進程調用MySQL的LOAD DATA INFILE將文本文件中的數據加載到MySQL表中。該文件可以包含當前日期和前幾天的一些數據。該表還可以包含以前日期的數據。問題是前一個日期文件中的某些列可能已經更改。但我不想更新所有這些列,但只想要一些列的最新值。使用LOAD DATA INFILE時,如何選擇性地更新表中的列?

實施例, 表

 
+----+-------------+------+------+------+ 
| id | report_date | val1 | val2 | val3 | 
+----+-------------+------+------+------+ 
| 1 | 2012-12-01 | 10 | 1 | 1 | 
| 2 | 2012-12-02 | 20 | 2 | 2 | 
| 3 | 2012-12-03 | 30 | 3 | 3 | 
+----+-------------+------+------+------+ 

數據在輸入文件中:

表後
 
1|2012-12-01|10|1|1 
2|2012-12-02|40|4|4 
3|2012-12-03|40|4|4 
4|2012-12-04|40|4|4 
5|2012-12-05|50|5|5 

負載應該像

 
mysql> select * from load_infile_tests; 
+----+-------------+------+------+------+ 
| id | report_date | val1 | val2 | val3 | 
+----+-------------+------+------+------+ 
| 1 | 2012-12-01 | 10 | 1 | 1 | 
| 2 | 2012-12-02 | 40 | 4 | 2 | 
| 3 | 2012-12-03 | 40 | 4 | 3 | 
| 4 | 2012-12-04 | 40 | 4 | 4 | 
| 5 | 2012-12-05 | 50 | 5 | 5 | 
+----+-------------+------+------+------+ 
5 rows in set (0.00 sec) 

注意,列VAL3值不更新。此外,我還需要爲大文件執行此操作,因此某些文件可能大於300Megs或更多,因此它需要成爲可擴展的解決方案。

感謝, Anirudha

+0

所以你不想更新名爲val3的列?只是想確定。 – Smit

+0

是啊,我不想更新一些列,如本例中的val3。 – anirudha13

+0

如果您不想更新該列,那麼它將設置爲空。你想要那個嗎? – Smit

回答

1

這將是很好的使用與REPLACE選項LOAD DATA INFILE,但在這種情況下,記錄將被丟棄,再加入,所以老val3值將丟失。

嘗試將數據加載到臨時表中,然後從temp中更新您的表。表使用INSERT ... SELECT/UPDATEINSERT ... ON DUPLICATE KEY UPDATE聲明。

+0

這是我們嘗試過的一些事情,但是在執行INSERT ... ON DUPLICATE KEY UPDATE時花費的時間大約比LOAD DATA INFILE大50%。希望是否有另一種解決方案不需要太多時間。 – anirudha13

+0

看來沒有其他辦法可以更快地做到這一點。但是,嘗試編寫一個可以讀取CSV文件並生成SQL語句的應用程序。 – Devart

+0

是的,它似乎沒有一個乾淨的方式來與SQL做到這一點。顯然這是Hadoop的用途。 :) – anirudha13