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

 更新时间:2014年07月08日 09:36:17   投稿:hebedich  
在实际项目中,我们经常会遇到删除数据库中重复数据的问题,貌似是很简单的问题哈,下面我们来探讨下

刚开始,根据我的想法,这个很简单嘛,上sql语句

delete from zqzrdp where tel in (select min(dpxx_id) from zqzrdp group by tel having count(tel)>1);

执行,报错!!~!~

异常意为:你不能指定目标表的更新在FROM子句。傻了,MySQL 这样写,不行,让人郁闷。

难倒只能分步操作,蛋疼

以下是网友写的,同样是坑爹的代码,我机器上运行不了。

1. 查询需要删除的记录,会保留一条记录。

select a.id,a.subject,a.RECEIVER from test1 a left join (select c.subject,c.RECEIVER ,max(c.id) as bid from test1 c where status=0 GROUP BY RECEIVER,SUBJECT having count(1) >1) b on a.id< b.bid where a.subject=b.subject and a.RECEIVER = b.RECEIVER and a.id < b.bid

2. 删除重复记录,只保留一条记录。注意,subject,RECEIVER 要索引,否则会很慢的。

delete a from test1 a, (select c.subject,c.RECEIVER ,max(c.id) as bid from test1 c where status=0 GROUP BY RECEIVER,SUBJECT having count(1) >1) b where a.subject=b.subject and a.RECEIVER = b.RECEIVER and a.id < b.bid;

3. 查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

4. 删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

delete from people where peopleId in (select peopleId from people group by peopleId  having count(peopleId) > 1) and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

5.删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

看来想偷懒使用一句命令完成这个事好像不太显示,还是老老实实的分步处理吧,思路先建立复制一个临时表,然后对比临时表内的数据,删除主表里的数据

alter table tableName add autoID int auto_increment not null; 

create table tmp select min(autoID) as autoID from tableName group by Name,Address; 

create table tmp2 select tableName.* from tableName,tmp where tableName.autoID = tmp.autoID; 

drop table tableName; 

rename table tmp2 to tableName; 


相关文章

  • MySQL 联合索引与Where子句的优化 提高数据库运行效率

    MySQL 联合索引与Where子句的优化 提高数据库运行效率

    网站系统上线至今,数据量已经不知不觉上到500M,近8W记录了。涉及数据库操作的基本都是变得很慢了,这篇文章主要是说明配置并不是数据库操作慢的主要原因
    2012-01-01
  • delete in子查询不走索引问题分析

    delete in子查询不走索引问题分析

    这篇文章主要为大家介绍了delete in子查询不走索引的问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 详解 Mysql 事务和Mysql 日志

    详解 Mysql 事务和Mysql 日志

    这篇文章主要介绍了详解 Mysql 事务和Mysql 日志的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL数据库跨版本迁移的实现三种方式

    MySQL数据库跨版本迁移的实现三种方式

    本文主要介绍了MySQL数据库跨版本迁移的实现,主要包含mysqldump,物理文件迁移和原地升级三种,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • 浅谈innodb_autoinc_lock_mode的表现形式和选值参考方法

    浅谈innodb_autoinc_lock_mode的表现形式和选值参考方法

    下面小编就为大家带来一篇浅谈innodb_autoinc_lock_mode的表现形式和选值参考方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • CentOS7.x 安装mysql5.7 XtraBackUp备份工具使用命令详解

    CentOS7.x 安装mysql5.7 XtraBackUp备份工具使用命令详解

    这篇文章主要介绍了CentOS7.x 安装mysql5.7 XtraBackUp备份工具使用,本文给大家介绍了mysql安装过程及命令使用方法,需要的朋友可以参考下
    2022-04-04
  • 登录mysql时出现的闪退问题解决

    登录mysql时出现的闪退问题解决

    大家在打开MySQL时,可能会遇到在登陆界面输入密码之后就闪退的这个问题,下面这篇文章主要给大家介绍了关于如何解决登录mysql时出现的闪退问题的相关资料,需要的朋友可以参考下
    2023-05-05
  • 数据库报错:Unknown column 'xxx' in 'where clause'问题的解决过程

    数据库报错:Unknown column 'xxx' in 

    但凡写过sql语句的人估计都曾经碰到过类似于Unknown column ‘xxx’ in ‘where clause’的问题,这篇文章主要给大家介绍了关于数据库报错:Unknown column 'xxx' in 'where clause'问题的解决过程,需要的朋友可以参考下
    2023-03-03
  • Navicat连接mysql报错问题

    Navicat连接mysql报错问题

    这篇文章主要介绍了Navicat连接mysql报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • 详细聊聊MySQL中慢SQL优化的方向

    详细聊聊MySQL中慢SQL优化的方向

    由于在MySQL日常查询中,查询类型的语句占慢sql的大部分,所以下面这篇文章主要给大家介绍了关于MySQL中慢SQL优化方向的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08

最新评论