`
javaliujie
  • 浏览: 59411 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MYSQL中删除重复记录的方法

阅读更多

在实际应用中,很可能会碰到一些需要删除某些字段的重复记录,我现在把我能想到的写下来,望高手们补充。

1、
具体实现如下:

Table         Create Table                                           
------------ --------------------------------------------------------
users_groups CREATE TABLE `users_groups` (                          
                `id` int(10) unsigned NOT NULL AUTO_INCREMENT,       
                `uid` int(11) NOT NULL,                              
                `gid` int(11) NOT NULL,                              
                PRIMARY KEY (`id`)                                   
              ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8

users_groups.txt内容:
1,11,502
2,107,502
3,100,503
4,110,501
5,112,501
6,104,502
7,100,502
8,100,501
9,102,501
10,104,502
11,100,502
12,100,501
13,102,501
14,110,501

mysql> load data infile 'c:\\users_groups.txt' into table users_groups fields
rminated by ',' lines terminated by '\n';
Query OK, 14 rows affected (0.05 sec)
Records: 14 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from users_groups;

query result(14 records)

id uid gid
1 11 502
2 107 502
3 100 503
4 110 501
5 112 501
6 104 502
7 100 502
8 100 501
9 102 501
10 104 502
11 100 502
12 100 501
13 102 501
14 110 501
14 rows in set (0.00 sec)

mysql> create temporary table tmp_wrap select * from users_groups group by uid having count(1) > 1 union all
select * from users_groups group by uid having count(1) = 1;
Query OK, 7 rows affected (0.11 sec)
Records: 7 Duplicates: 0 Warnings: 0

mysql> truncate table users_groups;
Query OK, 14 rows affected (0.03 sec)

mysql> insert into users_groups select * from tmp_wrap;
Query OK, 7 rows affected (0.03 sec)
Records: 7 Duplicates: 0 Warnings: 0

mysql> select * from users_groups;

query result(7 records)

id uid gid
1 11 502
2 107 502
3 100 503
4 110 501
5 112 501
6 104 502
9 102 501


mysql> drop table tmp_wrap;
Query OK, 0 rows affected (0.05 sec)

2、还有一个很精简的办法。

查找重复的,并且除掉最小的那个。

delete users_groups as a from users_groups as a,
(
select *,min(id) from users_groups group by uid having count(1) > 1
) as b
where a.uid = b.uid and a.id > b.id;

(7 row(s)affected)
(0 ms taken)

 

query result(7 records)

id uid gid
1 11 502
2 107 502
3 100 503
4 110 501
5 112 501
6 104 502
9 102 501

3、现在来看一下这两个办法的效率。

运行一下以下SQL 语句

create index f_uid on users_groups(uid);
explain select * from users_groups group by uid having count(1) > 1 union all
select * from users_groups group by uid having count(1) = 1;

explain select * from users_groups as a,
(
select *,min(id) from users_groups group by uid having count(1) > 1
) as b
where a.uid = b.uid and a.id > b.id;

query result(3 records)

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY users_groups index (NULL) f_uid 4 (NULL) 14  
2 UNION users_groups index (NULL) f_uid 4 (NULL) 14  
(NULL) UNION RESULT <union1,2> ALL (NULL) (NULL) (NULL) (NULL) (NULL)  

 

query result(3 records)

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 4  
1 PRIMARY a ref PRIMARY,f_uid f_uid 4 b.uid 1 Using where
2 DERIVED users_groups index (NULL) f_uid 4 (NULL) 14  

 

 

很明显的第二个比第一个扫描的函数要少。

分享到:
评论

相关推荐

    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