免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7470 | 回复: 1

利用临时表清除数据库重复数据 [复制链接]

论坛徽章:
0
发表于 2010-09-12 16:18 |显示全部楼层
上周遇到一个问题,开发忘了告诉DBA需要唯一索引,导致线上一个库出现了大量重复数据,需要立即清除,重复数据只保留一条,于是采用了临时表的方案。

首先查看重复数据的数量:

SELECT  c1,c2 FROM tbl GROUP BY c1,c2 HAVING count(ID)> 1
然后创建一张临时表,把上述结果存下来,这就是存在重复的数据各选出一条:

CREATE TABLE tbl_tmp_1
SELECT * FROM tbl GROUP BY c1,c2 HAVING count(ID)> 1
然后通过上述临时表与原表关联,获取全部存在重复的数据:

CREATE TABLE tbl_tmp_2
SELECT b.*
FROM tbl_tmp_1 a, tbl b
WHERE a.c1 = b.c1
AND a.c2D = b.c2;
验证一下有没有选错,即有没有不重复的数据被选出来了:

SELECT *
FROM tbl_tmp_2
GROUP BY c1, c2
HAVING count(*) = 1;
SELECT b.*
FROM tbl_tmp_2 a, rbl b
WHERE a.c1= b.c2
AND a.c2= b.c2
AND a.id=b.id;
全量删除所有重复数据:

DELETE FROM
tbl, tbl_tmp_2 USING tbl
INNER JOIN tbl_tmp_2
ON tbl.id = tbl_tmp_2.id;
将原重复数据中的一条都插入数据库中:

INERT INTO tbl
SELECT * FROM tbl_tmp_1;
都做完就可以加上唯一索引了:

ALTER TABLE tbl
ADD UNIQUE uk_tbl_c1_c2 (`c1`,`c2`) ;

论坛徽章:
0
发表于 2011-02-14 14:22 |显示全部楼层
很有用,参考下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP