MySQL 去除重复数据实例安详严整

发布时间:2019-11-04  栏目:sqlite  评论:0 Comments

前些天蒙受一个内需对表实行去重的主题素材,数据量大约千万左右,第后生可畏抉择便是按Oracle的思绪上:

MySQL 去除重复数据实例详细明白

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

有八个意思上的重复记录,一是截然重复的笔录,也即具有字段均都重复,二是有个别字段重复的笔录。对于第黄金时代种重复,对比便于解决,只需在查询语句中应用distinct关键字去重,差不离具有数据库系统都扶助distinct操作。爆发这种重新的因由根本是表设计不周,通过给表扩张主键或独一索引列就能够幸免。

以上相关子查询的SQL在c1上设有索引时间效益用不算低,不过很缺憾MySQL未有这种写法,相通的代表写法在MySQL中作用也低的势不两立,如中间表等招式。

select distinct * from t;

适逢其会在下一个月收拾一些shell脚本时管理过mysql导入时出错继续实施的标题,因而测验后选拔了如下办法:

对于第二类重复难点,常常需求查询出重复记录中的任一条记下。如果表t有id,name,address五个字段,id是主键,有双重的字段为name,address,必要拿到那多少个字段唯大器晚成的结果集。

1.将表数据导出:

— Oracle、MySQL,使用相关子查询

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

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

 where t1.id =

 (select min(t2.id)

  from t t2

  where t1.name = t2.name and t1.address = t2.address);

2.truncate表,然后创立独一索引

 — Hive只扶持在FROM子句中使用子查询,子查询必得著名字,而且列必需唯生机勃勃

truncate table TABLE;
create unique index IX_c1 on TABLE(c1);
select t1.*

 from t t1,

   (select name, address, min(id) id from t group by name, address) t2

 where t1.id = t2.id;

3.聊到底导入数据,必要加上-f选项。

— 还足以应用hive的row_number()剖判函数

mysql -uroot -p -f DBNAME<TABLE.sql
select t.id, t.name, t.address

 from (select id, name, address,

row_number() over (distribute by name, address sort by id) as rn 

     from t) t 

 where t.rn=1;

-f的效率是:Continue
even if an SQL error occurs.

感激阅读,希望能扶助到咱们,多谢我们对本站的协助!

如此那般导入时会报超级多的错误,就是因为独一限制的留存,你只必要最后检查下表的记录数时候与第一步中查到的数码生机勃勃致就足以了。

你大概感兴趣的篇章:

这种去重模式效用相比较高,缺欠大概是失误时显示屏上一批的‘Duplicate
entry’报错会消逝别的的报错。

别的还足以写存款和储蓄进度来删除重复数据,这种方法对数据库的震慑十分的小,不要求导出导入数据,存款和储蓄进度写法详见:https://www.cnblogs.com/leohahah/p/9401343.html

留下评论

网站地图xml地图