`

如何用MYSQL删除表中重复数据

 
阅读更多

 

 通常情况下,一个我们在做一个产品的时候,一开始可能由于设计考虑不周或者程序写的不够严谨,某个字段上的值产生重复了,但是又必须去掉,这个时候就稍微麻烦了一点,直接加一个 UNIQUE KEY 肯定是不行了,因为会报错。
 现在,我们来采用一种变通的办法,不过可能会丢失一些数据 :)

 在这里,我们设定一个表,其结构如下:

mysql> desc `user`;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | char(10)         | NO   |     |         |                |
| extra | char(10)         | NO   |     |         |                |
+-------+------------------+------+-----+---------+----------------+

 原来表中的数据假定有以下几条:

mysql> SELECT * FROM `user`;
+----+-------+--------+
| id | name  | extra  |
+----+-------+--------+
|  1 | user1 | user1  |
|  2 | user2 | user2  |
|  3 | user3 | user3  |
|  4 | user4 | user4  |
|  5 | user5 | user5  |
|  6 | user3 | user6  |
|  7 | user6 | user7  |
|  8 | user2 | user8  |
|  9 | USER2 | user9  |
| 10 | USER6 | user10 |
+----+-------+--------+

1、将原来的数据导出

mysql>SELECT * INTO OUTFILE '/tmp/user.txt' FROM `user`;

2、清空数据表

mysql>TRUNCATE TABLE `user`;

3、创建唯一索引,并且修改 `name` 字段的类型为 BINARY CHAR 区分大小写

mysql> ALTER TABLE `user` MODIFY `name` CHAR(10) BINARY NOT NULL DEFAULT '';

mysql> ALTER TABLE `user` ADD UNIQUE KEY ( `name` );

现在来看看新的表结构:

mysql> desc user;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | char(10)         | NO   | UNI |         |                |
| extra | char(10)         | NO   |     |         |                |
+-------+------------------+------+-----+---------+----------------+

4、把数据导回去,在这里,有两种选择:新的重复记录替换旧的记录,只保留最新的记录 或者是 新的记录略过,只保留最旧的记录

mysql> LOAD DATA INFILE '/tmp/user.txt' REPLACE INTO TABLE `user`;
Query OK, 10 rows affected (0.00 sec)
Records: 8  Deleted: 2  Skipped: 0  Warnings: 0

mysql> SELECT * FROM USER;
+----+-------+--------+
| id | name  | extra  |
+----+-------+--------+
|  1 | user1 | user1  |
|  8 | user2 | user8  |
|  6 | user3 | user6  |
|  4 | user4 | user4  |
|  5 | user5 | user5  |
|  7 | user6 | user7  |
|  9 | USER2 | user9  |
| 10 | USER6 | user10 |
+----+-------+--------+

 上面是采用 REPLACE 的方式,可以看到,导入过程中删掉了两条数据,结果验证确实是 新的重复记录替换旧的记录,只保留最新的记录
 现在,来看看用 IGNORE 的方式:

mysql> LOAD DATA INFILE '/tmp/user.txt' IGNORE INTO TABLE `user`;
Query OK, 6 rows affected (0.01 sec)
Records: 8  Deleted: 0  Skipped: 2  Warnings: 0

mysql> SELECT * FROM USER;
+----+-------+--------+
| id | name  | extra  |
+----+-------+--------+
|  1 | user1 | user1  |
|  2 | user2 | user2  |
|  3 | user3 | user3  |
|  4 | user4 | user4  |
|  5 | user5 | user5  |
|  7 | user6 | user7  |
|  9 | USER2 | user9  |
| 10 | USER6 | user10 |
+----+-------+--------+

 看到了吧,确实是 新的记录略过,只保留最旧的记录

 

 

查询时去重:

mysql 去除重复 Select中DISTINCT关键字的用法

 

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而 这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙,结果是我 们两人都郁闷了。。。。。。。。。

下面先来看看例子:

     table
   id name
   1 a
   2 b
   3 c
   4 c
   5 b

库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

select distinct name from table
得到的结果是:

   name
   a
   b
   c

好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

select distinct name, id from table

结果会是:

   id name
   1 a
   2 b
   3 c
   4 c
   5 b

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

我们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。。。。。。。

很麻烦吧?确实,费尽心思都没能解决这个问题。没办法,继续找人问。

拉住公司里一JAVA程序员,他给我演示了oracle里使用distinct之后,也没找到mysql里的解决方案,最后下班之前他建议我试试group by。

试了半天,也不行,最后在mysql手册里找到一个用法,用group_concat(distinct name)配合group by name实现了我所需要的功能,兴奋,天佑我也,赶快试试。

报错。。。。。。。。。。。。郁闷。。。。。。。连mysql手册也跟我过不去,先给了我希望,然后又把我推向失望,好狠哪。。。。

再仔细一查,group_concat函数是4.1支持,晕,我4.0的。没办法,升级,升完级一试,成功。。。。。。

终于搞定了,不过这样一来,又必须要求客户也升级了。

突然灵机一闪,既然可以使用group_concat函数,那其它函数能行吗?

赶紧用count函数一试,成功,我。。。。。。。想哭啊,费了这么多工夫。。。。。。。。原来就这么简单。。。。。。

现在将完整语句放出:

select *, count(distinct name) from table group by name

结果:

   id name count(distinct name)
   1 a 1
   2 b 1
   3 c 1

最后一项是多余的,不用管就行了,目的达到。。。。。

唉,原来mysql这么笨,轻轻一下就把他骗过去了,郁闷也就我吧(对了,还有容容那家伙),现在拿出来希望大家不要被这问题折腾。

哦,对,再顺便说一句,group by 必须放在 order by 和 limit之前,不然会报错。。。。。。。。!OK了

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/guocuifang655/archive/2009/03/16/3993612.aspx

分享到:
评论

相关推荐

    删除数据表中重复记录

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

    mysql多字段删除重复数据保留id最大的.txt

    mysql多字段删除重复数据保留id最大的.txt

    mysql查找删除表中重复数据方法总结

    在本篇文章中小编给大家整理了关于mysql查找删除表中重复数据方法和相关知识点,需要的朋友们参考下。

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

    首先按照常规首段,使用having函数检查重复项,完事一个一个的删除。不要问我having检测重复项的sql咋写,你懂得哈。。。这个在只有几条重复的时候还可以。要是几千上万条不同数据重复,那咋办。。。 完事呢,咱就...

    2023年,MySQL最新最详细的教程资源 详细讲解了MySQL的各种用法

    内容:包含了MySQL所有的详细用法, MySQL 连接 MySQL 创建数据库 MySQL 删除数据库 MySQL 选择数据库 ...MySQL 处理重复数据 MySQL 及 SQL 注入 MySQL 导出数据 MySQL 导入数据 MySQL 函数 MySQL 运算符

    MySQL处理重复数据的方法

    有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。 本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。 防止表中...

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

    在实际项目中,我们经常会遇到删除数据库中重复数据的问题,貌似是很简单的问题哈,下面我们来探讨下

    MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)

    最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性。 下面话不多说了...

    MySQL 处理重复数据

    有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。 本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。 防止表中...

    很全面的MySQL处理重复数据代码

    有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。 本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。 一、防止表...

    删除MySQL重复数据的方法

    本文实例讲述了删除MySQL重复数据的方法。分享给大家供大家参考。具体方法如下: 项目背景 在最近做的一个linux性能采集项目中,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据。因为在采集中,...

    shell脚本操作mysql数据库删除重复的数据

    由于每次执行只删除重复数据的一条,需要重复执行,如果本轮没有数据被删就OK #!/bin/sh # delete all company's duplicate uid MYSQL_BIN_PATH=/data/mysql/server/mysql_3306/bin MYSQL_SOCK_PATH=/data/mysql/...

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

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

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

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

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

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

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

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

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

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

    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 ...

Global site tag (gtag.js) - Google Analytics