当前位置:  数据库>mysql

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

    来源: 互联网  发布时间:2014-10-04

    本文导语:  表结构: mysql> desc demo; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(11) unsigned | NO | PRI | NULL | auto_increment | | site | varchar(10...

表结构:
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 当记录不存在时插入


    
 
 

您可能感兴趣的文章:

  • mysql数据库中的information_schema和mysql可以删除吗?
  • 怎么彻底删除mysql?
  • mysql 精简过程(删除一些文件)
  • PHP删除MYSQL中数据表
  • MySQL防止delete命令删除数据的两种方法
  • 我已经用源代码方式安装了apache,如何让它支持php和mysql(php没有安装,mysql安装的是rpm包),要不要重新安装apache?如何删除已有的ap
  • linux使用mysql删除数据库的问题,谢谢!
  • mysql数据库介绍 iis7站长之家
  • linux服务器清空MySQL的history历史记录 删除mysql操作记录
  • mysql手动删除BINLOG的方法
  • CentOS 系统 删除mysql 出现以下提示
  • MYSQL删除表中的指定ID数据
  • 删除mysql数据库中的重复数据记录
  • mysql 跨表查询、更新、删除示例
  • MySQL 删除大表的性能问题解决方案
  • 在WIN命令提示符下mysql 用户新建、授权、删除,密码修改
  • 完全卸载mysql(停止服务、卸载相关程序、删除注册表
  • win2000里开发的php+mysql程序,在bsd里不能删除修改,如何解决
  • mysql中多表删除其中ID相同记录的方法
  • MYSQL删除匿名用户的方法(提高安全性)
  • Mysql大表查询优化技巧总结及案例分析
  • 重装MySQL最后一步失败的完美解决方案(经验总结)
  • mysql sql语句总结
  • 学习mysql之后的一点总结(基础)
  • MySQL触发器学习总结
  • mysql-5.5.28源码安装过程中错误总结
  • 总结MySQL建表、查询优化的一些实用小技巧
  • Mysql跨表更新 多表update sql语句总结
  • 修改MYSQL密码的几种常用方法总结
  • 安装resin+mysql+IIS+JDK的总结
  • JSP/JAVABEAN+TOMCAT4.0.5+MYSQL组合建站总结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • xp下的mysql数据库如何迁移到linux中的mysql
  • Linux和windows下用mysql c++ library操作Mysql数据库
  • 解析mysql数据库还原错误:(mysql Error Code: 1005 errno 121)
  • mysql jdbc连接mysql数据库步骤及常见参数详解
  • mysql数据库备份命令分享(mysql压缩数据库备份)
  • mysql数据库介绍
  • Python Mysql数据库操作 Perl操作Mysql数据库
  • mysql数据库下载安装教程和使用技巧
  • 数据库迁移工具 DBConvert for MySQL & PostgreSQL
  • 快速修复损坏的MySQL数据库
  • 使用dreamhost空间实现MYSQL数据库备份方法
  • Oracle欲收购开源数据库MySQL未果
  • 请教mysql数据库连接问题
  • 有谁在redhat下安装过Mysql数据库?谢谢了
  • MySQL数据库备份恢复程序 MySQLDumper
  • 网易的MySQL数据库分支 InnoSQL
  • 如何用java连接mysql数据库?
  • 更改Mysql数据库存储位置的具体步骤
  • mysql数据库访问权限问题
  • 请问用resin作服务器,如何与mysql数据库连接?
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • Mysql查询错误:ERROR:no query specified原因
  • MySQL 重装MySQL后, mysql服务无法启动
  • php安装完成后如何添加mysql扩展
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3