尽人事听天命
-
2007-12-11
mysql中删除重复记录的更好的办法 - [技术]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://penghui.blogbus.com/logs/11876331.html
有表relation(id, aid, bid) 其中id为自增的id字段,主键。
现要加一个(aid, bid)的唯一索引,那首先要去掉aid和bid重复的记录,过去我是这样做的:
delete r1 from relation r1, relation r2 where r1.id>r2.id and r1.aid=r2.aid and r1.bid=r2.bid
由于需要自连接,会见临时表,当relation表极大时,实际超过百万,速度就已经无法接受了,上周五晚上,灵感一来,突然想到了一个办法,试验下来果然比原来快:
create table relation_new like relation;
alter table relation_new add unique key(aid, bid);
insert into relation_new select * from relation on duplicate key id=id;
然后再把表名改为原来的releation即可,还等于做了一遍optimize。
其实,原理就是忽略重复的key。
当时觉得无比激动,可是后来想想,都忽略了干嘛还要update id=id?mysql的insert不是有ignore关键字吗?
insert ignore into relation select * from relation
这样不就都解决了吗?鄙视自己一下自己的记性,怎么老忘记ignore关键字。---------------------------------------------------------------------------------------
后记:刚刚google了一下,其实还有更简单的方法:
SELECT * INTO OUTFILE '/tmp/user.txt' FROM `user`;
LOAD DATA INFILE '/tmp/user.txt' REPLACE INTO TABLE `user`;
replace还能改为ignore
这个方法我在mysql 4.0下用过,但是会有很麻烦的乱码以及引号问题,4.1和5.x不知道有没有改善。。。随机文章:
无题 2009-11-04鸡冻啊。 2009-11-04光的意义 2009-11-04FireFox访问iphone.6.cn和iphone.youku.com的方法 2007-12-13MyFirstBlog 2005-10-13
收藏到:Del.icio.us







