Java 使用加载数据填充时,如何有选择地更新表中的列?

Java 使用加载数据填充时,如何有选择地更新表中的列?,java,mysql,Java,Mysql,我试图通过从Java进程调用MySQL的load data INFILE,将文本文件中的数据加载到MySQL表中。此文件可以包含当前日期以及前几天的一些数据。该表还可以包含以前日期的数据。问题是文件中以前日期的某些列可能已更改。但我不想更新所有这些列,只想更新其中一些列的最新值 例如, 表 +----+-------------+------+------+------+ | id | report_date | val1 | val2 | val3 | +----+-------------+

我试图通过从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 | +----+-------------+------+------+------+ +----+-------------+------+------+------+ |id |报告|日期| 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 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) mysql>从加载填充测试中选择*; +----+-------------+------+------+------+ |id |报告|日期| 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行(0.00秒) 请注意,列val3值不会更新。此外,我还需要对大型文件执行此操作,一些文件的大小可以大于300Megs,因此它需要是一个可扩展的解决方案

谢谢,
Anirudha

最好使用带有替换选项的加载数据填充,但在这种情况下,记录将被删除并再次添加,因此旧的
val3
值将丢失


尝试将数据加载到临时表中,然后从临时表更新表。表使用/或语句。

所以您不想更新名为val3的列?只是想确定一下。是的,我不想更新一些列,比如本例中的val3。如果你不想更新该列,那么它将设置为null。你想要吗?不,我不想将列设置为null。这是我们尝试过的,但是做一些基准测试需要花费很多时间来做插入。。。在重复密钥更新时,大约比加载数据填充的时间长50%。我希望有没有另一种解决方案不会花那么多时间。似乎没有其他方法可以更快地解决问题。但是,试着编写一个可以读取CSV文件并生成SQL语句的应用程序。是的,似乎没有一种干净的方法可以用SQL实现这一点。显然,这就是Hadoop的用途。:)