我试图通过从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
答案 0 :(得分:1)
将LOAD DATA INFILE与REPLACE选项一起使用会很好,但在这种情况下,记录将被删除并再次添加,因此旧的val3
值将丢失。
尝试将数据加载到临时表中,然后从temp更新表。表使用INSERT ... SELECT / UPDATE或INSERT ... ON DUPLICATE KEY UPDATE语句。