我陷入了一个简单的更新查询。 我有一个表格说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。
以数据库大小上传内容的速度 请帮忙。
提前感谢。
答案 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);