加班的原因是要上线解决线上数据库重复数据的问题。我在程序中发现了一个错误并轻松解决了它。如果有问题,我在线更正了重复的数据。网库中有6张表有重复数据,其中2张比较大,一张96万+,一张30万+。因为之前处理过同样的问题,直接用上次的Python去重脚本,脚本很简单,连接数据库,找出重复数据,循环删除即可。emmmmm,不过这个效率实在是太低了,每秒一条,大概20000+重复数据,估计时间8小时左右。..不为自己着想,一味依赖前人的东西是有问题的!老想着以前怎么可能,为什么现在不行了,这也是个问题!最近发现状态真的不对,失去了探索求知的欲望,今天是一记警钟,感觉迷途归来了。言归正传,下面详细介绍去重步骤。创建表`animal`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(20)DEFAULTNULL,`age`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8COLLATE=utf8_bin;插入`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('1','cat','12');INSERTINTO`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('2','dog','13');INSERTINTO`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('3','camel','25');INSERTINTO`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('4','cat','32');INSERTINTO`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('5','dog','42');目标:我们要删除同名数据。先看哪些数据重复SELECTname,count(1)FROMstudentGROUPBYNAMEHAVINGcount(1)>1;output:namecount(1)cat2dog2name是cat和dog重复的数据,每个重复的数据有两条;Select*FromtableWhererepeatedfieldIn(SelectrepeatedfieldFromtableGroupByrepeatedfieldHavingCount(1)>1)删除所有重复的数据,如果没有留下直接删除会报错DELETEFROMstudentWHERENAMEIN(SELECTNAMEFROMstudentGROUPBYNAMEHAVINGcount(1)>1)error:1093-Youcan'tspecifytargettable'student'forupdateinFROMclause,Time:0.016000s原因是:在更新这张表的同时,也查询了这张表,同时查询了这张表,这张表是同时更新的,可以理解为死锁。mysql不支持这种更新查询同一张表的操作。解决方法:将需要更新的数据列查询为第三方表,然后过滤更新。DELETEFROMstudentWHERENAMEIN(SELECTt.NAMEFROM(SELECTNAMEFROMstudentGROUPBYNAMEHAVINGcount(1)>1)t)删除删除表中重复的数据,只保留一条。在删除之前,我们可以先查看一下我们要删除的是哪些重复数据。.idFROM(SELECTMIN(id)ASidFROMstudentGROUPBY`name`)t)是什么意思,就是先按name分组,找出id最小的数据,这些数据就是我们要保留的kindling,然后找出id不在里面,就是我们要去重的重复数据。另外,关注Java知音公众号,回复“后端面试”,送你面试题集!开始删除重复数据,只留一个很简单,直接把select换成deletetoDELETEFROMstudentWHEREidNOTIN(SELECTt.idFROM(SELECTMIN(id)ASidFROMstudentGROUPBY`name`)t)90万+表执行超快。全做完了
