首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速删除MySQL中的重复记录

问快速删除MySQL中的重复记录
EN

Stack Overflow用户
提问于 2015-10-01 15:32:27
回答 2查看 601关注 0票数 1

我正在尝试将非常大的SQL (大约3700万行)导入到InnoDB表中。有大量的重复,我想要达到的是,不改变实际转储想要防止重复行插入。字段email可能有重复项。我尝试了如下:将整个转储导入到db之后,我尝试执行以下SQL:

代码语言:javascript
复制
set session old_alter_table=1;
ALTER IGNORE TABLE sample ADD UNIQUE (email);

但是第二个查询工作了大约一个小时,然后我就取消了这个查询。

什么是正确的方法来摆脱重复的?

我有几个想法:

  • 也许在开始导入之前,创建一个具有唯一索引的表,并在插入时防止重复,而不损害整个过程?
  • 也许在导入转储后选择不同的电子邮件并插入到另一个表中?
EN

回答 2

Stack Overflow用户

发布于 2015-10-01 15:37:23

来自.dump文件

导入时,使用-f进行“强制”:

代码语言:javascript
复制
mysql -f -p < 2015-10-01.sql

这将导致导入在遇到错误后继续进行,如果在导入之前创建唯一的键约束,则在本例中非常有用。

来自.csv文件

如果使用的是“加载数据”,请使用“忽略”,例如:

代码语言:javascript
复制
LOAD DATA LOCAL INFILE 'somefile.csv' IGNORE
    INTO TABLE some_db.some_tbl
        FIELDS TERMINATED BY ';'
               OPTIONALLY ENCLOSED BY '"'
        LINES TERMINATED BY '\n'
    (`somefield1`,`somefield2`);

根据文档

如果指定“忽略”,则将丢弃在唯一键值上复制现有行的行。

这要求您在导入之前创建唯一的键约束,该约束将在空表上快速运行。

票数 0
EN

Stack Overflow用户

发布于 2015-10-01 16:03:53

按以下方式编辑转储文件:

  1. 修改CREATE TABLE语句以在email字段中添加一个唯一的键,或者在它之后添加一个ALTER TABLE语句。
  2. 查找所有INSERT INTO sample语句,并将它们更改为INSERT IGNORE INTO sample。

还可以使用管道执行步骤2:

代码语言:javascript
复制
sed 's/INSERT INTO sample/INSERT IGNORE INTO sample/' sample_table.dump | mysql -u root -p sample_db

如果文件太大,无法编辑以添加ALTER TABLE语句,我建议您使用--no-create-info选项创建转储到mysqldump,并在加载转储文件之前手动创建表(使用唯一的键)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32891480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档