`
Everyday都不同
  • 浏览: 723708 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

【mysql】删除重复数据

阅读更多

最近因为发现数据库中的表有脏数据,需要维护。这些脏数据就是重复数据,需要将其删除。

可能因为你在建表的时候考虑欠佳,需要为表里面的几个字段建立一个(联合)唯一索引,但是没有建立,而由于不止一个写的程序在往表里面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加上一个联合索引即可。

  • 大小: 12.9 KB
  • 大小: 9.3 KB
  • 大小: 1.5 KB
  • 大小: 7.2 KB
2
7
分享到:
评论

相关推荐

    MySQL删除重复记录

    ### MySQL删除重复记录 在MySQL中,重复记录可能由于各种原因而出现,比如数据导入错误、系统故障或人为操作失误等。这些重复记录不仅浪费存储空间,还可能导致查询结果不准确,因此及时删除它们是非常必要的。 ##...

    MySQL 查询重复内容只显示一条

    标题“MySQL 查询重复内容只显示一条”涉及到的是在MySQL数据库中如何处理重复数据的问题。在数据分析或数据存储过程中,有时我们需要找出并处理重复的记录,只保留一条作为代表。这通常可以通过聚合函数和分组来...

    MySQL中如何处理重复数据(Duplicate)?

    MySQL 中处理重复数据(Duplicate)的方法 MySQL 中处理重复数据(Duplicate)的主要方式是使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语句或 REPLACE INTO 语句。下面是这两种方法的详细解释: 一、INSERT ...

    mysql查找删除重复数据并只保留一条实例详解

    本文将详细介绍如何在MySQL中查找并删除重复数据,同时只保留其中一条,具体以实例进行解析。 首先,假设我们有一个名为`test`的表格,包含以下字段:`school_id`、`school_name`、`total_student`和`test_takers`...

    MYSQL删除重复数据的简单方法

    在MySQL中,删除重复数据是一项常见的数据库维护任务。在标题和描述中提到的问题是尝试使用一个SQL查询来删除具有相同值的记录,但遇到了错误。下面将详细解释这个问题,并提供几种有效的方法来处理MySQL中删除重复...

    Mysql删除重复数据保留最小的id 的解决方法

    在并发环境下,为了防止在删除过程中其他事务插入新的重复数据,可以使用MySQL的锁表功能。例如,可以使用`LOCK TABLES`命令锁定表,确保在删除操作期间不会有任何其他修改。但在实际应用中,应谨慎使用锁,因为它...

    mysql多字段删除重复数据保留id最大的.txt

    mysql多字段删除重复数据保留id最大的.txt

    删除MySQL重复数据的方法

    本文实例讲述了删除MySQL重复数据的方法。分享给大家供大家参考。具体方法如下: 项目背景 在最近做的一个linux性能采集项目中,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据。因为在采集中,...

    MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)

    本文主要探讨如何查询并删除MySQL中的重复数据,同时保留每个重复组中ID最小的一条记录。 首先,我们需要找到表中的重复数据。假设我们有一个名为`brand`的表,其中包含品牌名称`brandName`和其他字段,而我们想要...

    很全面的MySQL处理重复数据代码

    MySQL处理重复数据是一个常见的数据库管理任务,涉及到数据的完整性和一致性。本文将详细介绍如何在MySQL中防止、统计和过滤重复数据。 首先,防止表中出现重复数据是确保数据质量的关键步骤。在MySQL中,可以通过...

    MySQL 删除数据库中重复数据方法小结

    在MySQL数据库管理中,删除重复数据是一个常见的需求,特别是在数据导入、同步或用户输入错误时。处理这种情况需要谨慎,以确保不会丢失重要信息。本文将详细介绍几种常见的删除重复数据的方法。 1. **基础方法:...

    mysql优化小技巧之去除重复项实现方法分析【百万级数据】

    本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...

    MySQL中删除重复数据的简单方法

    在MySQL数据库管理中,删除重复数据是一个常见的需求,特别是在数据清洗和数据分析时。传统的删除重复数据的方法,如使用`NOT IN`或`DISTINCT`,可能会导致效率低下,特别是当处理大量数据时。本文将介绍一种高效的...

    MySQL处理重复数据的方法

    这里,我们主要探讨如何防止和删除MySQL数据表中的重复数据。 首先,为了防止数据表出现重复数据,我们可以利用 PRIMARY KEY(主键) 或 UNIQUE(唯一) 索引来实现。主键是表中的一个或多个字段,其值在整个表中是...

    MySQL 处理重复数据的方法(防止、删除)

    处理MySQL中的重复数据涉及多个层面,包括在设计阶段通过设置主键和唯一索引来预防,使用`INSERT IGNORE`或`REPLACE INTO`来处理插入时的重复,以及利用`GROUP BY`, `HAVING`, `DISTINCT`等查询构造来查找和删除重复...

    shell脚本操作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数据去重复

    总之,MySQL提供了多种方法来查询和删除重复数据。根据具体需求和数据量,选择合适的方法并进行适当的优化,可以有效地维护数据的整洁和一致性。在处理大量数据时,务必谨慎操作,确保数据安全。

Global site tag (gtag.js) - Google Analytics