如何去除数据表中的重复数据

通常情况下,一个我们在做一个产品的时候,一开始可能由于设计考虑不周或者程序写的不够严谨,某个字段上的值产生重复了,但是又必须去掉,这个时候就稍微麻烦了一点,直接加一个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 |
+----+-------+--------+


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

时间: 2024-10-07 07:14:38

如何去除数据表中的重复数据的相关文章

MSSql简单查询出数据表中所有重复数据的方法_MsSql

本文实例讲述了MSSql简单查询出数据表中所有重复数据的方法.分享给大家供大家参考,具体如下: 这里直接给出下面的例子: SELECT * FROM SYS_LogContent slc WHERE slc.LogInfo_ID IN ( SELECT slc2.LogInfo_ID FROM SYS_LogContent slc2 GROUP BY slc2.LogInfo_ID HAVING COUNT(*)>1 ) 简单说明: 关键代码在于上面的括号中.要想查询出所有重复的数据,可以按照某

MSSql简单查询出数据表中所有重复数据的方法

本文实例讲述了MSSql简单查询出数据表中所有重复数据的方法.分享给大家供大家参考,具体如下: 这里直接给出下面的例子: SELECT * FROM SYS_LogContent slc WHERE slc.LogInfo_ID IN ( SELECT slc2.LogInfo_ID FROM SYS_LogContent slc2 GROUP BY slc2.LogInfo_ID HAVING COUNT(*)>1 ) 简单说明: 关键代码在于上面的括号中.要想查询出所有重复的数据,可以按照某

删除数据表中的重复记录

数据|重复|重复记录 删除交通违章数据表中的重复记录(同一时间[haptime].车号牌[numberplate].处罚原因[reason])一.方法原理:  1.Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的, rowid确定了每条记录是在ORACLE中的哪一个数据文件.块.行上. 2.在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除. 二.实现方法:1.查询重复记录select

怎样删除表中的重复数据,谢谢大家

问题描述 怎样删除表中的重复数据,谢谢大家 表内容如下: id fwbm kjbh sfxm dj yl ....................... 52578 d01142 d011422015928 001 .400 0 54.70 54.70 0 0 2015-09-28 00:00:00.000 NULL 52579 d01142 d011422015928 040 2.990 2 5.98 5.98 0 0 2015-09-28 00:00:00.000 NULL 52580 d0

MSSQL如何在没有主键的表中删除重复数据

原文:MSSQL如何在没有主键的表中删除重复数据 为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据: create database testdb use testdb ; go create table DupsNoPK (Col1 int Null, Col2 char(5) Null ); go insert DupsNoPK(Col1,Col2) Values(1,'abc'), (2,'abc'), (2,'abc'), (2,'abc'), (7,'xy

Excel怎么在两个工作表中查找重复数据

  2.现在我们的实例是从Sheet3工作表找出己经在Sheet4工作表中姓名相同的记录.因为我们现在在Sheet3工作表对应列中输入以下"=if(B2=" 如下图红框所示. 3.现在我们在excel中直接切换到Sheet4工作表中,然后如下图所示框选姓名区域,并按回车键. 4.现在再回到sheet3工作表后,补全公式"=if(B2=Sheet4!B2:B24,"是","否")"如下图所示. 5.然后将光标移动到单元格右下角,

mysql 数据表中查找重复记录_Mysql

复制代码 代码如下: select user_name,count(*) as count from user_table group by user_name having count>1; 这个我在很早有发过一个asp下的ACCESS 的

在Excel中标记重复数据的方法

  在Excel中,我们通常做的数据都密集着很多数字,要自己一个个的寻找重复的数据,肯定会懵掉的,那有什么比较好的方式可以找出Excel数据表中的重复数据吗?有的,来看看吧! 将下图的工作表的重复数据进行标记.如图所示: 数据表 1.首先打开excel2007工作表,用鼠标框选选中可能存在重复数据或记录的单元格区域.单击"开始"选项卡中的"条件格式"打开菜单,在"突出显示单元格规则"子菜单下选择"重复值",打开. 选择&quo

2005-如何在SQL数据表中如何剔除连续重复的记录,统计个数时只记做1条记录?

问题描述 如何在SQL数据表中如何剔除连续重复的记录,统计个数时只记做1条记录? 各位大虾帮帮忙:如何剔除数据表中连续重复的记录记做1条记录?? 数据表如下,我想要取result=0的sn在各prodorderid下的个数( 注意:要剔除连续重复的数据,记做1条记录,但是不连续的重复的分别记为1条记录 ) create table test ( id int identity(1,1) primary key, sn varchar(50) not null, prodorderid int n