`
liseor
  • 浏览: 47092 次
  • 性别: 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 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删除重复记录方法。

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

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

    删除数据表中重复记录

    删除重复记录 删除数据表中的重复记录,包括MySQL、SQL Server、Oracle等

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

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

    MySQL数据库中删除重复记录的方法总结[推荐]

    表结构: mysql&gt; desc demo; +——-+——————+——+—–+———+—————-+ | Field | Type | Null | Key | Default | Extra | +——-+——————+——+—–+———+—————-+ | id | int(11) unsigned |...

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

    通过存储过程,删除Mysql数据库表中的重复记录,只保留一条;

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

    查询及删除重复记录的SQL语句,虽然有点乱,但内容还是不错的。

    SQL重复记录查询和删除方法

    MYSQL 查询和删除重复记录的方法很多,下面为您介绍几种常用的 MYSQL 查询和删除重复记录的方法,希望对您查询和删除重复数据方面能有所帮助。  SQL重复记录查询的几种方法:  1. 查找表中多余的重复记录,重复...

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

    采用的是下面的方法可删除,假设重复的是test数据库中的title字段 代码如下:create table bak as (select * from test group by title having count(*)=1); insert into bak (select * from test...

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

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

    MySQL 如何查找并删除重复记录的实现

    今天我们就来谈谈如何查找 MySQL 表中的重复数据以及如何删除这些重复的记录。 创建示例表 首先创建一个示例表 people 并生成一些数据: drop table if exists people; create table people ( id int auto_...

    MySQL处理重复数据的方法

    有些 MySQL 数据表中可能存在重复的记录,有些...让我们尝试一个实例:下表中无索引及主键,所以该表允许出现多条重复记录。 CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) )

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

    代码如下:CREATETABLE`users`(`id`int(10)NOTNULLAUTO_...原因是mysql删除动作不能带有本表的查询动作,意思是你删除users表的东西不能以users表的信息为条件所以这个语句会报错,执行不了。只要通过创建临时表作

    Mysql删除重复的数据 Mysql数据去重复

    MySQL数据库中查询重复数据 select * from employee group by emp_name having count (*)&gt;1; Mysql 查询可以删除的重复数据 select t1.* from employee t1 where (t1.emp_name) in (select t4.emp_name from ...

    sqlserver 删除重复记录处理(转)

    注:此处“重复”非完全重复,意为某字段数据重复 HZT表结构 ID int Title nvarchar(50) AddDate datetime 数据 一. 查找重复记录 1. 查找全部重复记录 Select * From 表 Where 重复字段 In (Select ... 删除重复记录

    mysql删除表中某一字段重复的记录

    我想删除表event中sid重复的记录,请问有没有这样SQL语句?或是通过其它方法? 代码如下:delete from event as e where id != (select min(id) from event where sid=e.sid); or 代码如下:delete ...

    sql 删除表中的重复记录

    如下sql,找出重复的记录,和重复记录中ID值最小的记录(表中ID为自增长) select MIN(ID) as id, StructSN ,Date,UserID,StarCount,COUNT(StructSN) as c from T_Dor_StructStar where Date &gt;= '20160919' group ...

Global site tag (gtag.js) - Google Analytics