1

私は単純な更新クエリで立ち往生しています。「name」列と「phone_no」列を含む table1 というテーブルがあります。名前と連絡先番号のリストを含むcsvファイルをアップロードすると、重複した番号の名前を前のものと更新したいと思います。たとえば。「最大」「8569589652」を含む行があります。同じ番号を別の名前でアップロードすると、「stela」「8569589652」と言うと、stela は最大値に更新されます。

この目的のために、table2 という別のテーブルを作成しました。次に、table1 から table2 にすべての重複エントリを収集しました。その後、以前の名前で新しいエントリを更新しました。

以下は私のクエリです:すべての重複エントリを収集するには:

INSERT INTO table2 SELECT phone_no,name FROM table1 
            GROUP BY phone_no HAVING COUNT(*)>1;

table1 の重複エントリを更新するには:

UPDATE table1.table2 SET table1.name=table2.name 
       WHERE table1.phone_no=table2.phone_no ;

私の問題は、これら 2 つのクエリを実行すると時間がかかりすぎることです。1000 個の数字の csv ファイルをアップロードするのに 30 分以上かかります。csv を短時間でアップロードするようにクエリを最適化することを提案してください。

アップロードの速度はデータベースのサイズに関係します..助けてください。

前もって感謝します。

4

3 に答える 3

1

私が提案したリンクからの手順は次のとおりです。

1) 新しい一時テーブルを作成します。

CREATE TEMPORARY TABLE temporary_table LIKE target_table;

2) 必要に応じて、テンポラリ テーブルからすべてのインデックスを削除して処理を高速化します。

SHOW INDEX FROM temporary_table;
DROP INDEX `PRIMARY` ON temporary_table;
DROP INDEX `some_other_index` ON temporary_table;

3) CSV を一時テーブルにロードする

LOAD DATA INFILE 'your_file.csv'
INTO TABLE temporary_table
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(field1, field2);

4) ON DUPLICATE KEY UPDATE を使用してデータをコピーします。

SHOW COLUMNS FROM target_table;
INSERT INTO target_table
SELECT * FROM temporary_table
ON DUPLICATE KEY UPDATE field1 = VALUES(field1), field2 = VALUES(field2);

5) 一時テーブルを削除します

DROP TEMPORARY TABLE temporary_table;
于 2013-08-02T05:42:29.757 に答える
0

CSV ファイルを一時テーブルにダンプします。

次に、単純にマージステートメントを適用します

AS TEMP を使用して AS MAIN をマージ

MAIN.CONTACT_NO=TEMP.CONTACT_NO が一致した場合、MAIN.NAME=TEMP.NAME を更新します。一致しないレコードを挿入したい場合は、一致しないときにこれを使用して挿入してください

(NAME, CONTACT_NO) VALUES (TEMP.NAME, TEMP.CONTACT_NO);

マージ コマンドは「;」で終了する必要があることに注意してください。利用した ';' 更新後、それを削除して以下の部分を追加し、マージ全体を「;」で終了します

お役に立てれば

さらにヘルプが必要な場合は更新してください。

于 2013-08-02T05:52:44.640 に答える
0

以下のように、「電話番号」の重複エントリを更新できます。

INSERT INTO table2 (phone_no,name)
      VALUES
      ('11111', aaa),
      ('22222', bbb),
      ('33333', cccc),
ON DUPLICATE KEY UPDATE
     phone_no = VALUES(phone_no);
于 2013-08-02T05:53:14.263 に答える