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

表结构:
mysql> desc demo;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| site | varchar(100) | NO | MUL | | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

数据:
mysql> select * from demo order by id;
+----+------------------------+
| id | site |
+----+------------------------+
| 1 | http://www.CodeBit.cn |
| 2 | http://YITU.org |
| 3 | http://www.ShuoWen.org |
| 4 | http://www.CodeBit.cn |
| 5 | http://www.ShuoWen.org |
+----+------------------------+
5 rows in set (0.00 sec)

当没有创建表或创建索引权限的时候,可以用下面的方法:

如果你要删除较旧的重复记录,可以使用下面的语句:
mysql> delete from a
-> using demo as a, demo as b
-> where (a.id > b.id)
-> and (a.site = b.site);
Query OK, 2 rows affected (0.12 sec)

mysql> select * from demo order by id;
+----+------------------------+
| id | site |
+----+------------------------+
| 1 | http://www.CodeBit.cn |
| 2 | http://YITU.org |
| 3 | http://www.ShuoWen.org |
+----+------------------------+
3 rows in set (0.00 sec)

如果你要删除较新的重复记录,可以使用下面的语句:
mysql> delete from a
-> using demo as a, demo as b
-> where (a.id < b.id)
-> and (a.site = b.site);
Query OK, 2 rows affected (0.12 sec)

mysql> select * from demo order by id;
+----+------------------------+
| id | site |
+----+------------------------+
| 2 | http://YITU.org |
| 4 | http://www.CodeBit.cn |
| 5 | http://www.ShuoWen.org |
+----+------------------------+
3 rows in set (0.00 sec)

你可以用下面的语句先确认将被删除的重复记录:
mysql> SELECT a.*
-> FROM demo a, demo b
-> WHERE a.id > b.id
-> AND (a.site = b.site);
+----+------------------------+
| id | site |
+----+------------------------+
| 1 | http://www.CodeBit.cn |
| 3 | http://www.ShuoWen.org |
+----+------------------------+
2 rows in set (0.00 sec)

如果有创建索引的权限,可以用下面的方法:

在表上创建唯一键索引:


mysql> alter ignore table demo add unique index ukey (site);
Query OK, 5 rows affected (0.46 sec)
Records: 5 Duplicates: 2 Warnings: 0

mysql> select * from demo order by id;
+----+------------------------+
| id | site |
+----+------------------------+
| 1 | http://www.CodeBit.cn |
| 2 | http://YITU.org |
| 3 | http://www.ShuoWen.org |
+----+------------------------+
3 rows in set (0.00 sec)


重复记录被删除后,如果需要,可以删除索引:


mysql> alter table demo drop index ukey;
Query OK, 3 rows affected (0.37 sec)
Records: 3 Duplicates: 0 Warnings: 0

如果有创建表的权限,可以用下面的方法:

创建一个新表,然后将原表中不重复的数据插入新表:


mysql> create table demo_new as select * from demo group by site;
Query OK, 3 rows affected (0.19 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| demo |
| demo_new |
+----------------+
2 rows in set (0.00 sec)

mysql> select * from demo order by id;
+----+------------------------+
| id | site |
+----+------------------------+
| 1 | http://www.CodeBit.cn |
| 2 | http://YITU.org |
| 3 | http://www.ShuoWen.org |
| 4 | http://www.CodeBit.cn |
| 5 | http://www.ShuoWen.org |
+----+------------------------+
5 rows in set (0.00 sec)

mysql> select * from demo_new order by id;
+----+------------------------+
| id | site |
+----+------------------------+
| 1 | http://www.CodeBit.cn |
| 2 | http://YITU.org |
| 3 | http://www.ShuoWen.org |
+----+------------------------+
3 rows in set (0.00 sec)


然后将原表备份,将新表重命名为当前表:


mysql> rename table demo to demo_old, demo_new to demo;
Query OK, 0 rows affected (0.04 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| demo |
| demo_old |
+----------------+
2 rows in set (0.00 sec)

mysql> select * from demo order by id;
+----+------------------------+
| id | site |
+----+------------------------+
| 1 | http://www.CodeBit.cn |
| 2 | http://YITU.org |
| 3 | http://www.ShuoWen.org |
+----+------------------------+
3 rows in set (0.00 sec)


注意:使用这种方式创建的表会丢失原表的索引信息!


mysql> desc demo;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id | int(11) unsigned | NO | | 0 | |
| site | varchar(100) | NO | | | |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

如果要保持和原表信息一致,你可以使用 show create table demo; 来查看原表的创建语句,然后使用原表的创建语句创建新表,接着使用 insert … select 语句插入数据,再重命名表即可。

当然,如果要避免重复记录,最好的办法还是不要插入重复数据,可以参考本站另外一篇文章:MySQL 当记录不存在时插入

(0)

相关推荐

  • MySQL 删除数据库中重复数据方法小结

    刚开始,根据我的想法,这个很简单嘛,上sql语句 delete from zqzrdp where tel in (select min(dpxx_id) from zqzrdp group by tel having count(tel)>1); 执行,报错!!~!~ 异常意为:你不能指定目标表的更新在FROM子句.傻了,MySQL 这样写,不行,让人郁闷. 难倒只能分步操作,蛋疼 以下是网友写的,同样是坑爹的代码,我机器上运行不了. 1. 查询需要删除的记录,会保留一条记录. select

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

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

  • 删除MySQL重复数据的方法

    本文实例讲述了删除MySQL重复数据的方法.分享给大家供大家参考.具体方法如下: 项目背景 在最近做的一个linux性能采集项目中,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据.因为在采集中,对于同一台设备,同一个时间点应该只有一个数据,然而,数据库中存入了多个数据.对于如何造成了这个结果,一时没有想清楚,但为了解决入库慢的问题,首先要删除冗余数据. 问题描述 数据库的表结构很简单,如下: 复制代码 代码如下: +----------------+--------------+

  • MySQL中删除重复数据的简单方法

    MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式,用这个方式,五百万数据,十来分钟就全部去除重复了,请各位参考. 第一步:从500万数据表data_content_152里提取出不重复的字段SFZHM对应的ID字段到TMP3表 create table tmp3 as select min(id) as col1 from data_content

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

    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 (select t2.emp_name from employee t2 group by t2.emp_name having count(*)>1)

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

    复制代码 代码如下: CREATETABLE`users`(`id`int(10)NOTNULLAUTO_INCREMENT,`name`char(50)NOTNULL,PRIMARYKEY(`id`)) 复制代码 代码如下: deletefromuserswhereidin(selectmin(id)fromusersgroupbynamehavingcount(name)>1); 结果报错:1093youcan'tspecifytargettable.... 原因是mysql删除动作不能带有

  • mysql查找删除重复数据并只保留一条实例详解

    有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 50 1240 Abraham Lincoln High School 70 35 1241 Acalanes High School 120 89 1242 Academy Of The Canyons 30 30 1243 Agoura High School 89 40 1244 Agour

  • Mysql删除重复数据保留最小的id 的解决方法

    在网上查找删除重复数据保留id最小的数据,方法如下: DELETE FROM people WHERE peopleName IN ( SELECT peopleName FROM people GROUP BY peopleName HAVING count(peopleName) > 1 ) AND peopleId NOT IN ( SELECT min(peopleId) FROM people GROUP BY peopleName HAVING count(peopleName) >

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

    表结构: mysql> desc demo; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(11) unsigned | NO | PRI | NULL

  • SQL Server2008中删除重复记录的方法分享

    现在让我们来看在SQL SERVER 2008中如何删除这些记录, 首先,可以模拟造一些简单重复记录: 复制代码 代码如下: Create Table dbo.Employee ( [Id] int Primary KEY , [Name] varchar(50), [Age] int, [Sex] bit default 1 ) Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(1,'James',25,default)

  • SqlServer2005中使用row_number()在一个查询中删除重复记录的方法

    下面我们来看下,如何利用它来删除一个表中重复记录: 复制代码 代码如下: If Exists(Select * From tempdb.Information_Schema.Tables Where Table_Name Like '#Temp%') Drop Table #temp Create Table #temp ([Id] int, [Name] varchar(50), [Age] int, [Sex] bit default 1) Go Insert Into #temp ([Id

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

    前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: select title,count(*) as count from user_table group by title having count>1; SELECT * FROM t_info a WHERE ((SELECT COUNT(*) FROM t_info WHERE Title = a.Title) > 1) ORDER BY Titl

  • SQL重复记录查询 查询多个字段、多表查询、删除重复记录的方法

    SQL重复记录查询 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 例二:  select * from testtable where numeber in (select number from people group by numbe

  • Pandas标记删除重复记录的方法

    Pandas提供了duplicated.Index.duplicated.drop_duplicates函数来标记及删除重复记录 duplicated函数用于标记Series中的值.DataFrame中的记录行是否是重复,重复为True,不重复为False pandas.DataFrame.duplicated(self, subset=None, keep='first') pandas.Series.duplicated(self, keep='first') 其中参数解释如下: subse

  • SqlServer 2005中使用row_number()在一个查询中删除重复记录

    下面我们来看下,如何利用它来删除一个表中重复记录: 复制代码 代码如下: If Exists(Select * From tempdb.Information_Schema.Tables Where Table_Name Like '#Temp%') Drop Table #temp Create Table #temp ([Id] int, [Name] varchar(50), [Age] int, [Sex] bit default 1) Go Insert Into #temp ([Id

  • 数据库查询排除重复记录的方法

    今天由于工作需要,需要在数据库中找出某一字段下不同的记录值,很简单的问题被我想的太复杂,很是郁闷,原因是SQL的一条命令忘了,现问题已解决,赶快拿来做备忘. 其实这里只需要用到SQL中的DISTINCT命令即可,非常简单,语法如下: 复制代码 代码如下: SELECT DISTINCT 列名称 FROM 表名称 举例说明: 假设现有一个数据库表:htmer: 复制代码 代码如下: field001 记录1 记录2 记录1 记录3 现在这张表中有四条记录,但有一条记录是重复的,如果我要去掉该重复记

  • mysql数据库中1045错误的解决方法

    本地数据库连接服务器数据库报1045,如何解决? 这个意思是说:用户"root"@本地主机的访问被拒绝 解决方案: 1.找到MySQL安装路径下的my.ini文件,用记事本的方式打开: 2.打开后,找到mysqld这个位置,这个文件的内容中有多个mysqld,注意看箭头所指位置 3.在 [mysqld] 底下添加语句:skip-grant-tables,添加完毕后保存. skip-grant-tables作为启动参数的作用:MYSQL服务器不加载权限判断,任何用户都能访问数据库.也就是

随机推荐