mysql删除重复数据,保留一条
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql删除重复数据,保留一条相关的知识,希望对你有一定的参考价值。
参考技术A mysql数据表中有多条重复数据记录,现在想删除删除部分重复数据,保留最后一条更新或者插入的数据。以学生表为例,我们创建一个简单的数据表来做实验:
往表里面插入一些实验数据:
我们可以根据分组查询先将重复数据查询出来,同时也可以获取到最后的更新时间,然后再与原表联表查询小于最大时间的数据,将查询出来的数据删除。
------先来慢慢消化-------
在做删除前,我们可以先看看有哪些数据是有重复的:
可以看到张三,李四,王五的数据是有重复的,赵六没有重复,下面我们查找最后更新的记录。
可以看到,最后更新的数据为15:57:46的记录没有在结果中。
可以看到重复记录已经被清理掉。
假如有两行记录是完全一样的,这个方法就不可行了,往表里面在跑一次数据插入:
执行删除计划:
创建一个临时表存放最后插入的一条数据(包含重复与没有重复的),然后清空原表,再将临时表的数据复制到原表中,最后把临时表删除。
这个很好理解,相当于ctrl+c,ctrl+v的操作,数据表如下:
这样数据去重就完成了,需要注意的是, 如果表数据量很大,注意在group by 里面的字段建立索引,同时,生产环境注意好先进行数据备份操作 。
mysql删除重复数据,保留最新的那一条
因为数据库没键外键,在关联查询的时候,会碰到查询条数多余数据库实际条数,这因为关联字段在表中有重复值而导致的。
解决方案:
1、数据库脚本删除重复数据,保留最新的一条
2、对关联字段增加唯一约束
例如:
以下表,部门表的部门编号出现了重复。
首先判断是不是重复
1 select count(*) from department d 2 3 select count(*) from ( select distinct dept_code from department )
看以上查出来的数量是不是相同的,不同则就是dept_code有出现重复的
接下来删除重复值,并保留最新的记录
1 delete from department where id in ( 2 select * from ( 3 select d.id 4 from department d 5 inner join ( 6 select m.dept_code,max(m.sys_tm) max_tm FROM department m group by m.dept_code having count(1) > 1 7 ) a on a.dept_code = d.dept_code 8 where d.sys_tm <> a.max_tm 9 ) tmp 10 );
给该字段增加唯一索引
1 ALTER TABLE `department` 2 ADD UNIQUE INDEX `idex_dept_code` (`dept_code`);
以上是关于mysql删除重复数据,保留一条的主要内容,如果未能解决你的问题,请参考以下文章