应用中有时候会有 删除表中重复记录的需求 ,现在在这里举个例子,分享下我的解决方案,如有不完善的地方,喜欢大家能留言给我,大家一起进步。
例子:
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中查询、删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as count from user_table group by title having ...
本文将详细介绍如何在不同的数据库系统(如MySQL、SQL Server、Oracle等)中删除重复记录。 #### SQL删除重复记录的基本思路 删除重复记录的核心思想是先识别出哪些记录是重复的,然后通过某种方式将这些重复记录...
### 方法1:基于`NOT IN`子句删除重复记录 这种方法通过找出每个重复组中最大`id`的记录保留下来,删除其他非最大`id`的记录。SQL语句如下: ```sql DELETE FROM YourTable WHERE id NOT IN (SELECT MAX(id) FROM ...
在MySQL数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,如删除重复记录。在给定的存储过程`DelDuplicateRecord`中,它旨在删除具有相同标题的记录,但仅保留每个标题下最早的一条记录...
mysql彻底理解删除重复记录sql脚本,只保留一条记录
这种情况下,MySQL会锁定所有匹配的主键记录,确保删除操作的原子性。 8. 非唯一索引删除已标记为删除的记录: 如果记录已被标记为删除,但物理上仍然存在,删除操作依然会锁定这些记录。 9. 唯一索引删除已标记...
以下是一个简单的示例代码片段,展示了如何在 Delphi 中删除重复记录: ```delphi uses ADODB; procedure RemoveDuplicates(ADataset: TDataSet); var CurrentRecord, LastRecord: Variant; begin // 先移动到...
以下是一个具体的步骤,演示如何在MySQL中删除重复的数据记录,特别是针对`test`数据库中`title`字段的重复记录。 首先,创建一个临时表`bak`,用于存储不重复的记录。这里使用的SQL语句是: ```sql CREATE TABLE ...
以下是一种方法,保留`id`最小的重复记录: ```sql SELECT t1.* FROM ( SELECT name, email, MIN(id) AS min_id FROM users GROUP BY name, email HAVING COUNT(*) > 1 ) t2 JOIN users t1 ON t1.name = t2...
下面将详细解释这个问题,并提供几种有效的方法来处理MySQL中删除重复数据的情况。 首先,我们来看一下原始的删除语句: ```sql DELETE FROM users WHERE id IN (SELECT MIN(id) FROM users GROUP BY name HAVING ...
总结来说,MySQL删除重复行的方法主要是通过自连接来实现的。此方法的关键在于找到重复行,并基于某种主键或唯一标识(在本例中是`id`)选择保留的行。这种方法适用于那些有明确唯一标识符的表,能够有效地删除重复...
本文将介绍一种高效的方法,适用于MySQL中删除重复数据。 首先,我们假设有一个名为`data_content_152`的表,其中包含大量的重复记录。目标是保留唯一的数据,并删除重复项。以下是这种方法的步骤: 1. **创建临时...
本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...
本文主要探讨了在MySQL中如何查找并删除重复行,这对于维护数据库的整洁性和提高查询效率有着重要的作用。 首先,我们需要明确什么是重复行。在MySQL中,如果表中的某一行与其他行在特定列上的值完全相同,那么这些...
- 删除重复记录,保留`rowid`最小的记录: ```sql DELETE FROM people WHERE peopleId IN (SELECT peopleId FROM people GROUP BY peopleId HAVING COUNT(peopleId) > 1) AND rowid NOT IN (SELECT MIN(rowid...
本文将详细介绍如何在MySQL中查找并删除重复数据,同时只保留其中一条,具体以实例进行解析。 首先,假设我们有一个名为`test`的表格,包含以下字段:`school_id`、`school_name`、`total_student`和`test_takers`...