1

我陷入了一个简单的更新查询。我有一个表说 tabble1 包含“名称”和“电话号码”列。现在,当我上传包含姓名和联系电话列表的 csv 文件时,我想用前一个更新重复号码的名称。例如。我有一行包含'max''8569589652'。现在,当我用另一个名字上传相同的号码时说“stela”“8569589652”,那么 stela 应该会更新到最大。

为此,我创建了另一个表 table2。然后我将 table1 中的所有重复条目收集到 table2 中。之后用以前的名称更新了新条目。

以下是我的查询:收集所有重复条目:

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

更新表 1 中的重复条目:

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

我的问题是当我运行这两个查询时,它花费了太多时间。上传 1000 个数字的 csv 文件需要半个多小时。请建议我优化查询以在更短的时间内上传 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 文件转储到临时表中。

然后简单地应用合并语句

合并为主要使用作为临时

在 MAIN.CONTACT_NO=TEMP.CONTACT_NO 匹配时更新 MAIN.NAME=TEMP.NAME; 如果您想插入不匹配的记录,请在不匹配时使用,然后插入

(姓名,CONTACT_NO)值(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 回答