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

create table yw (

id int unsigned not null auto_increment,

name char(10) not null,

extra char(10) not null,

primary key(id)

); 

select * from yw;

+----+-------+-------+

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

+----+-------+-------+

SELECT INTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA …INFILE语句恢复数据。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构。

1、将原来的数据导出

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

2、清空数据表

mysql>TRUNCATE TABLE `yw`;

3、创建唯一索引,

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

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

mysql> LOAD DATA INFILE '/tmp/user.txt' REPLACE INTO TABLE `yw`;

Query OK, 10 rows affected (0.00 sec)

Records: 8  Deleted: 2  Skipped: 0  Warnings: 0

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