• 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-04
    MyFirstBlog 2005-10-13

    收藏到:Del.icio.us