mysql查询更新重复的条目

时间:2013-08-02 05:36:21

标签: php mysql sql csv

我陷入了一个简单的更新查询。 我有一个表格说tabble1包含'name'和'phone_no'列。现在,当我上传包含姓名和联系号码列表的csv文件时,我想更新前一个重复号码的名称。对于前者我有一行包含'max''8569589652'。现在,当我上传相同的号码与另一个名字说'stela''8569589652'然后stela shuld更新到最大。

为此我创建了另一个表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 ;

我的问题是,当我运行这两个查询时,它花费了太多时间。上传1000个号码的csv文件需要花费半个多小时。 请建议我优化查询以在更短的时间内上传csv。

以数据库大小上传内容的速度 请帮忙。

提前感谢。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

将您的CSV文件转储到临时表中。

然后aply merge语句

合并  作为主要 使用  AS TEMP

在 MAIN.CONTACT_NO = TEMP.CONTACT_NO 当匹配更新时 MAIN.NAME = TEMP.NAME; 如果您想要插入非匹配记录,请使用此功能 什么时候不匹配 然后插入

(NAME, 联系方式) VALUES ( TEMP.NAME, TEMP.CONTACT_NO );

请注意,合并命令必须以';'结尾 我用过 ';'在upadate删除它并添加下面的部分并以';'

结束整个合并

希望这有帮助

如果需要更多帮助,请更新。

答案 2 :(得分:0)

您可以更新“电话号码”的重复条目,如下所示。

INSERT INTO table2 (phone_no,name)
      VALUES
      ('11111', aaa),
      ('22222', bbb),
      ('33333', cccc),
ON DUPLICATE KEY UPDATE
     phone_no = VALUES(phone_no);