0

I have a table:

| foo | bar |
+-----+-----+
| abc |   4 |
| def |   1 |
| ghi |   2 |

foo has unique index.
I want to load a file into this table summing bar values of duplicates by foo column:

abc \t 7
ghi \t 3
jkl \t 4

Is there any way to sum values in duplicate rows during LOAD DATA?
This command replaces old values in a row:

LOAD DATA LOCAL INFILE 'file.txt' REPLACE
INTO TABLE `table` FIELDS TERMINATED BY '\t' (`foo`,`bar`);

I want to have a table like this:

| foo | bar |
+-----+-----+
| abc |  11 |
| def |   1 |
| ghi |   5 |
| jkl |   4 |
4

1 に答える 1

1

レコードのソースはテーブルからではなくファイルからのものであるため、目的を達成するための直接的な方法はありません。次の手順に従って、新しい行を挿入するか、既存の行を更新します。

  • レコードの一時ターゲット テーブルとして機能する一時テーブルを作成します。
  • 新しいテーブルに名前が付けられTempTable、次の 2 つの列があるとfoo仮定して、レコードを一時テーブルにロードします。bar

テーブル作成 ddl:

CREATE TABLE TempTable
(
    foo VARCHAR(30),
    bar INT
);

LOAD DATA LOCAL INFILE 'file.txt' 
REPLACE INTO TABLE TempTable 
FIELDS TERMINATED BY '\t' (`foo`,`bar`);
  • レコードがロードされたら、レコードの結合から始めましょう。MySQL は と呼ばれる機能を実装しましたINSERT...ON DUPLICATE UPDATE。これは基本的に新しいレコードを挿入しますが、レコードが既存のキーと競合する場合はレコードを更新します。Akeyは最初に定義する必要がありますが、あなたの場合、それfooはすでに一意であると述べたので、ステートメントを直接実行できます。

を使用しINSERT INTO...SELECTて組み合わせることができINSERT..ON DUPLICATE UPDATE

INSERT INTO YourExistingTable (Foo, Bar) 
SELECT Foo, Bar
FROM   TempTable
ON DUPLICATE KEY UPDATE Bar = VALUES(Bar) + Bar;
  • ステートメントを実行した後、レコードが結合されます。これで、一時テーブルを削除できます。

一時テーブルの削除、

DROP TABLE TempTable
于 2013-04-08T04:49:45.313 に答える