0

Java プロセスから MySQL の LOAD DATA INFILE を呼び出して、テキスト ファイルから MySQL テーブルにデータをロードしようとしています。このファイルには、現在の日付と前日のデータが含まれている場合があります。テーブルには、以前の日付のデータを含めることもできます。問題は、ファイル内の以前の日付の列の一部が変更されている可能性があることです。しかし、これらの列をすべて更新したくはありませんが、一部の列の最新の値のみが必要です。

例、表

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

ロード後のテーブルは次のようになります

mysql> select * from load_infile_tests;
+----+-------------+------+------+------+
| | 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 の値は更新されないことに注意してください。また、大きなファイルに対してもこれを行う必要があります。一部のファイルは 300 メガバイト以上になる可能性があるため、スケーラブルなソリューションである必要があります。

ありがとう、アニルダ

4

1 に答える 1

1

LOAD DATA INFILEをREPLACEオプションとともに使用するとよいでしょうが、この場合、レコードは削除されて再度追加されるため、古いval3値は失われます。

データを一時テーブルにロードしてから、テーブルを一時テーブルから更新してみてください。INSERT ... SELECT / UPDATEまたはINSERT...ON DUPLICATEKEYUPDATEステートメントを使用するテーブル。

于 2012-12-14T08:05:57.650 に答える