应用中有时候会有 删除表中重复记录的需求,现在在这里举个例子,分享下我的解决方案,如有不完善的地方,喜欢大家能留言给我,大家一起进步。 例子:
CREATE TABLE `users` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` char(50) NOT NULL, PRIMARY KEY (`id`) );
表中name字段存在重复,解决思路首先是如何找到重复的记录然后将其删除; 或者用逆向思维,找到要保留的数据,将是剩下的数据删除。 一般有两个方法:
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
1)找到要删除的数据然后删除这些数据。具体实现如下,
delete from users where id in (select a.id from (select id from users group by name having count(name) > 1) as a);
加上 having count(name) > 1 可以避免扫描没有重复的记录,提高效率.
2)找到要保留的数据 然后用not in 来删除不再这些数据中的记录。 大家很容易就想到如下的sql语句
delete from users where id not in (select * from (select min(id) from users group by name) as a);
(在mysql中记住要给表区别名,否则会报错的....)
Comments
请在后台配置评论类型和相关的值。