应用中有时候会有 删除表中重复记录的需求 ,现在在这里举个例子,分享下我的解决方案,如有不完善的地方,喜欢大家能留言给我,大家一起进步。
例子:
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 data_content_49_tmp like data_content_49
Insert into data_content_49_tmp SELECT * FROM `data_content_49` where Tel <> '' group by `ProductTitle`;
drop table data_content_49;
alter table data_content_49_tmp rename data_content_49;
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中查询、删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as count from user_table group by title having ...
删除重复记录 删除数据表中的重复记录,包括MySQL、SQL Server、Oracle等
mysql彻底理解删除重复记录sql脚本,只保留一条记录
表结构: mysql> desc demo; +——-+——————+——+—–+———+—————-+ | Field | Type | Null | Key | Default | Extra | +——-+——————+——+—–+———+—————-+ | id | int(11) unsigned |...
通过存储过程,删除Mysql数据库表中的重复记录,只保留一条;
查询及删除重复记录的SQL语句,虽然有点乱,但内容还是不错的。
MYSQL 查询和删除重复记录的方法很多,下面为您介绍几种常用的 MYSQL 查询和删除重复记录的方法,希望对您查询和删除重复数据方面能有所帮助。 SQL重复记录查询的几种方法: 1. 查找表中多余的重复记录,重复...
采用的是下面的方法可删除,假设重复的是test数据库中的title字段 代码如下:create table bak as (select * from test group by title having count(*)=1); insert into bak (select * from test...
本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...
今天我们就来谈谈如何查找 MySQL 表中的重复数据以及如何删除这些重复的记录。 创建示例表 首先创建一个示例表 people 并生成一些数据: drop table if exists people; create table people ( id int auto_...
有些 MySQL 数据表中可能存在重复的记录,有些...让我们尝试一个实例:下表中无索引及主键,所以该表允许出现多条重复记录。 CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) )
代码如下:CREATETABLE`users`(`id`int(10)NOTNULLAUTO_...原因是mysql删除动作不能带有本表的查询动作,意思是你删除users表的东西不能以users表的信息为条件所以这个语句会报错,执行不了。只要通过创建临时表作
MySQL数据库中查询重复数据 select * from employee group by emp_name having count (*)>1; Mysql 查询可以删除的重复数据 select t1.* from employee t1 where (t1.emp_name) in (select t4.emp_name from ...
注:此处“重复”非完全重复,意为某字段数据重复 HZT表结构 ID int Title nvarchar(50) AddDate datetime 数据 一. 查找重复记录 1. 查找全部重复记录 Select * From 表 Where 重复字段 In (Select ... 删除重复记录
我想删除表event中sid重复的记录,请问有没有这样SQL语句?或是通过其它方法? 代码如下:delete from event as e where id != (select min(id) from event where sid=e.sid); or 代码如下:delete ...
如下sql,找出重复的记录,和重复记录中ID值最小的记录(表中ID为自增长) select MIN(ID) as id, StructSN ,Date,UserID,StarCount,COUNT(StructSN) as c from T_Dor_StructStar where Date >= '20160919' group ...