MySQL去除重复数据

前些天遇上三个供给对表举行去重的标题,数据量大致千万左右,第二增选正是按Oracle的笔触上:

delete from table t1 where id < (select max(id) from table t2 where t1.c1=t2.c1);  --将c1值相同的记录进行去重,只留下id最大的,写成id>min(id)效果相同。

如上相关子查询的SQL在c一上存在索引时功效不算低,不过很遗憾MySQL没有那种写法,类似的替代写法在MySQL中效用也低的令人切齿,如中间表等招数。

凑巧在前些日子整理1些shell脚本时处理过mysql导入时出错继续执行的题材,因而测试后使用了如下办法:

一.将表数据导出:

mysqldump -uroot -p --skip-extended-insert -t DBNAME TABLE>TABLE.sql

然后记一下去重后的记录数:
select count(*) from (select 1 from TABLE group by c1) a;

2.truncate表,然后创造唯一索引

truncate table TABLE;
create unique index IX_c1 on TABLE(c1);

3.最终导入数据,必要添加-f选项。

mysql -uroot -p -f DBNAME<TABLE.sql

-f的意义是:Continue
even if an SQL error occurs.

那般导入时会报很多的荒唐,便是因为唯一约束的存在,你只需求最终检查下表的记录数时候与第一步中查到的数据一致就能够了。

那种去重格局功能相比高,缺陷只怕是失误时显示屏上一批的‘Duplicate
entry’报错会淹没其余的报错。

除此以外还足以写存款和储蓄进度来删除重复数据,那种方法对数据库的熏陶较小,无需导出导入数据,存款和储蓄进程写法详见:https://www.cnblogs.com/leohahah/p/9401343.html

相关文章