`
gxhslcww
  • 浏览: 79018 次
  • 性别: Icon_minigender_1
  • 来自: 南通
社区版块
存档分类
最新评论

MYSQL中删除重复记录的方法

阅读更多
应用中有时候会有 删除表中重复记录的需求 ,现在在这里举个例子,分享下我的解决方案,如有不完善的地方,喜欢大家能留言给我,大家一起进步。

例子:
CREATE TABLE `users` (                         
                `id` int(10) NOT NULL AUTO_INCREMENT,                                  
                `name` char(50) NOT NULL,                             
                PRIMARY KEY (`id`)                                  
              )

表中name字段存在重复,解决思路首先是如何找到重复的记录然后将其删除;或者用逆向思维,找到要保留的数据,将是剩下的数据删除。

一般有两个方法:
1. 是用中间表来实现

     1) 使用 create table like 复制出来一个中间表 ,然后用insert into select 把不重复的表导入到中间表中,然后再用中间表替代旧表。 具体实现如下
   create table tmp_users like users;
   Insert into tmp_users select min(`id`), `name`   from users group by name ;
   drop   table  users   ;
   alter   table   tmp_users  rename  users;

     2) 使用 create table select 直接复制出来一个含有数据的中间表 然后用中间表替代旧表。 具体实现如下
   create table tmp_users  select min(`id`), `name`   from users group by name ;
   truncate table users;
   insert into users select * from tmp_users;
   drop table tmp_users ;

以上两种方法的区别就是 create table like  和 create table select 的区别 ,create table like 复制的表结构包含索引 而 create table select 不包含索引,没有索引对业务影响很大,这个要特别留意的。还有就是create table like  和 create table select  复制的表没有把表的权限给copy过来。要事后从新设置下。数据量大的时候应该选择 create table select ,先倾倒数据事后再为表建立索引。

至于用中间表的数据更新旧表的策略,要么用drop旧表再rename中间表。 要么清空旧表数据再导入中间表数据。数据量大的时候前面方法效率较高。

2. 用一条sql语句来实现

   1)找到要删除的数据 然后删除这些数据。具体实现如下,

      delete users as a from users as a,(
          select min(id) , name from users group by name having count(name) > 1
      ) as b
      where a.name = b.name and a.id <> b.id;

      加上 having count(name) > 1 可以避免扫描没有重复的记录,提高效率

   2)找到要保留的数据 然后用not in 来删除不再这些数据中的记录。大家很容易就想到如下的sql语句:
      delete from users where id not in ( select min(id)  from users group by name ); 但是mysql删  除动作不能带有本表的查询动作,意思是你删除users表的东西不能以users表的信息为条件 所以这个语句会报错,执行不了。只要通过创建临时表作为查询条件。具体实现如下:

delete from users where id not in ( select * from ( select min(id)  from users group by name ) );
分享到:
评论

相关推荐

    MySQL删除重复记录

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

    MySQL中查询、删除重复记录的方法大全

    本文主要给大家介绍了关于MySQL中查询、删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as count from user_table group by title having ...

    删除数据表中重复记录

    本文将详细介绍如何在不同的数据库系统(如MySQL、SQL Server、Oracle等)中删除重复记录。 #### SQL删除重复记录的基本思路 删除重复记录的核心思想是先识别出哪些记录是重复的,然后通过某种方式将这些重复记录...

    mysql删除重复记录语句的方法

    ### 方法1:基于`NOT IN`子句删除重复记录 这种方法通过找出每个重复组中最大`id`的记录保留下来,删除其他非最大`id`的记录。SQL语句如下: ```sql DELETE FROM YourTable WHERE id NOT IN (SELECT MAX(id) FROM ...

    通过存储过程删除Mysql数据库表中的重复记录.pdf

    在MySQL数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,如删除重复记录。在给定的存储过程`DelDuplicateRecord`中,它旨在删除具有相同标题的记录,但仅保留每个标题下最早的一条记录...

    mysql彻底理解删除重复记录sql脚本,只保留一条记录

    mysql彻底理解删除重复记录sql脚本,只保留一条记录

    MySQL DELETE 删除语句加锁分析1

    这种情况下,MySQL会锁定所有匹配的主键记录,确保删除操作的原子性。 8. 非唯一索引删除已标记为删除的记录: 如果记录已被标记为删除,但物理上仍然存在,删除操作依然会锁定这些记录。 9. 唯一索引删除已标记...

    Delphi自动删除数据库中重复记录..rar

    以下是一个简单的示例代码片段,展示了如何在 Delphi 中删除重复记录: ```delphi uses ADODB; procedure RemoveDuplicates(ADataset: TDataSet); var CurrentRecord, LastRecord: Variant; begin // 先移动到...

    删除mysql数据库中的重复数据记录

    以下是一个具体的步骤,演示如何在MySQL中删除重复的数据记录,特别是针对`test`数据库中`title`字段的重复记录。 首先,创建一个临时表`bak`,用于存储不重复的记录。这里使用的SQL语句是: ```sql CREATE TABLE ...

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

    以下是一种方法,保留`id`最小的重复记录: ```sql SELECT t1.* FROM ( SELECT name, email, MIN(id) AS min_id FROM users GROUP BY name, email HAVING COUNT(*) &gt; 1 ) t2 JOIN users t1 ON t1.name = t2...

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

    下面将详细解释这个问题,并提供几种有效的方法来处理MySQL中删除重复数据的情况。 首先,我们来看一下原始的删除语句: ```sql DELETE FROM users WHERE id IN (SELECT MIN(id) FROM users GROUP BY name HAVING ...

    mysql删除重复行的实现方法

    总结来说,MySQL删除重复行的方法主要是通过自连接来实现的。此方法的关键在于找到重复行,并基于某种主键或唯一标识(在本例中是`id`)选择保留的行。这种方法适用于那些有明确唯一标识符的表,能够有效地删除重复...

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

    本文将介绍一种高效的方法,适用于MySQL中删除重复数据。 首先,我们假设有一个名为`data_content_152`的表,其中包含大量的重复记录。目标是保留唯一的数据,并删除重复项。以下是这种方法的步骤: 1. **创建临时...

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

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

    谈MySQL中重复行的查找删除.pdf

    本文主要探讨了在MySQL中如何查找并删除重复行,这对于维护数据库的整洁性和提高查询效率有着重要的作用。 首先,我们需要明确什么是重复行。在MySQL中,如果表中的某一行与其他行在特定列上的值完全相同,那么这些...

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

    - 删除重复记录,保留`rowid`最小的记录: ```sql DELETE FROM people WHERE peopleId IN (SELECT peopleId FROM people GROUP BY peopleId HAVING COUNT(peopleId) &gt; 1) AND rowid NOT IN (SELECT MIN(rowid...

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

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

Global site tag (gtag.js) - Google Analytics