找回密码
 注册
搜索
热搜: java php web
查看: 953|回复: 18

[数据库] mysql中删除重复记录的更好的办法

[复制链接]
发表于 2009-5-22 10:32:54 | 显示全部楼层 |阅读模式
有表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-5-22 19:08:37 | 显示全部楼层
为了学习币,支持
回复

使用道具 举报

发表于 2009-5-24 15:20:12 | 显示全部楼层
up,学习
回复

使用道具 举报

发表于 2009-5-27 00:17:34 | 显示全部楼层
支持
回复

使用道具 举报

发表于 2009-5-30 15:12:11 | 显示全部楼层
好方法~!顶
回复

使用道具 举报

发表于 2009-6-1 07:12:10 | 显示全部楼层
好,
回复

使用道具 举报

发表于 2009-8-10 10:35:02 | 显示全部楼层
值得一看
回复

使用道具 举报

发表于 2009-8-10 18:37:24 | 显示全部楼层
支持
回复

使用道具 举报

发表于 2009-8-10 18:45:57 | 显示全部楼层
好方法....支持
回复

使用道具 举报

发表于 2009-8-14 13:08:48 | 显示全部楼层
好方法....支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|软晨网(RuanChen.com)

GMT+8, 2024-11-13 10:08

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表