最近因为发现数据库中的表有脏数据,需要维护。这些脏数据就是重复数据,需要将其删除。
可能因为你在建表的时候考虑欠佳,需要为表里面的几个字段建立一个(联合)唯一索引,但是没有建立,而由于不止一个写的程序在往表里面insert数据,造成数据的重复~~
现在需要删除这些重复数据,看了看网上前辈们写的例子,大多数不能用,rowid也出来了,而mysql中是没有rowid的。
现假设有一张t_test表,主键字段为id,还有date,time,cnt1,cnt,cnt3三个字段。假设date,time组合起来规定只能有一条记录(即需要为date,time建立联合唯一索引)。表中数据如下:
可以看出:表中数据明显有不满足条件的重复数据。
我们先查询出有哪些重复数据(按date, time两个字段):
SELECT * FROM t_test WHERE (DATE, TIME) IN(SELECT DATE,TIME FROM t_test GROUP BY DATE, TIME HAVING COUNT(1)>1);
结果如下:
尝试使用网上的方法删除:
DELETE FROM t_test a WHERE (a.date, a.time) IN(SELECT DATE,TIME FROM t_test GROUP BY DATE, TIME HAVING COUNT(1)>1) AND rowid NOT IN(SELECT MIN(rowid) FROM t_test GROUP BY DATE, TIME HAVING COUNT(1)>1)
根本行不通,因为rowid在MySQL里面是不存在的,这不同于Oracle。。
还需注意的一点是:mysql中不支持在delete语句里使用表别名,所以无法进行自连接来删除表中的记录!
解决方法:使用一个中间临时表过渡~~
首先,建立一个临时表如下:
CREATE TEMPORARY TABLE tmp AS SELECT MIN(id) FROM t_test GROUP BY DATE,TIME
查看临时表tmp的内容:
SELECT * FROM tmp
得到:
这张临时表记录了重复记录里id最小的主键,以及没有重复记录的主键信息。
接下来,删除不在里面的记录即可:
DELETE FROM t_test WHERE id NOT IN(SELECT * FROM tmp)
检查下现在的记录:
SELECT * FROM t_test
发现:
发现,记录终于“干净”了。。重复性的记录被成功删除了!
当然比较保险的做法是建表时期就给date和time字段加上一个联合索引。或者删除重复记录之后再alter table加上一个联合索引即可。
相关推荐
在网上查找删除重复数据保留id最小的数据,方法如下: DELETE FROM people WHERE peopleName IN ( SELECT peopleName FROM people GROUP BY peopleName HAVING count(peopleName) > 1 ) AND peopleId ...
mysql多字段删除重复数据保留id最大的.txt
本文实例讲述了删除MySQL重复数据的方法。分享给大家供大家参考。具体方法如下: 项目背景 在最近做的一个linux性能采集项目中,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据。因为在采集中,...
代码如下:CREATETABLE`users`(`id`int(10)NOTNULLAUTO_...原因是mysql删除动作不能带有本表的查询动作,意思是你删除users表的东西不能以users表的信息为条件所以这个语句会报错,执行不了。只要通过创建临时表作
主要为大家详细介绍了MySQL处理重复数据的实现代码,如何防止数据表出现重复数据及如何删除数据表中的重复数据,感兴趣的小伙伴们可以参考一下
有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。 本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。 防止表中...
查重是我们在工作中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有...
主要介绍了mysql查找删除重复数据并只保留一条实例详解的相关资料,需要的朋友可以参考下
有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。 本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。 防止表中...
主要介绍了MySQL中删除重复数据的简单方法,比起一般的NOT IN语句的效率更为高,需要的朋友可以参考下
本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...
在实际项目中,我们经常会遇到删除数据库中重复数据的问题,貌似是很简单的问题哈,下面我们来探讨下
内容:包含了MySQL所有的详细用法, MySQL 连接 MySQL 创建数据库 MySQL 删除数据库 MySQL 选择数据库 ...MySQL 处理重复数据 MySQL 及 SQL 注入 MySQL 导出数据 MySQL 导入数据 MySQL 函数 MySQL 运算符
主要介绍了MySQL 处理重复数据的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
由于每次执行只删除重复数据的一条,需要重复执行,如果本轮没有数据被删就OK #!/bin/sh # delete all company's duplicate uid MYSQL_BIN_PATH=/data/mysql/server/mysql_3306/bin MYSQL_SOCK_PATH=/data/mysql/...
主要介绍了Mysql删除重复的数据 Mysql数据去重复,需要的朋友可以参考下