使用LOAD DATA INFILE时,如何有选择地更新表中的列?

时间:2012-12-13 22:03:40

标签: java mysql

我试图通过从Java进程调用MySQL的LOAD DATA INFILE来将数据从文本文件加载到MySQL表中。此文件可以包含当前日期和前几天的一些数据。该表还可以包含以前日期的数据。问题是文件中某些以前日期的列可能已更改。但我不想更新所有这些列,只想要一些列的最新值。

实施例, 表

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

1 个答案:

答案 0 :(得分:1)

将LOAD DATA INFILE与REPLACE选项一起使用会很好,但在这种情况下,记录将被删除并再次添加,因此旧的val3值将丢失。

尝试将数据加载到临时表中,然后从temp更新表。表使用INSERT ... SELECT / UPDATEINSERT ... ON DUPLICATE KEY UPDATE语句。