ORA-01452报错的一种解决办法

oracle库中有表TABLE,字段A,B,C,D,E,在字段A,B,D上建唯一索引时报错:ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found.说明表中A,B,D字段上存在重复值,需要去重。

查询A,B,D有重复值的数据,建立临时表

create table tmp_rid1 as select "A", "B", "D", count(*) cnt, min(rowid) rid

from TABLE group by "A", "B", "D" having count(*)>1;

删除重复数据

delete from TABLE where rowid in ( select rid from tmp_rid1 );

再建索引就可以了。

有时候,如上操作之后,再建索引仍然返回ORA-01452报错。这是因为有些重复数据的重复记录不止一条

查看最大重复次数

select max(cnt) from tmp_rid1;

当max(cnt)>2,如上操作之后就仍存在重复数据,需要继续重复如上操作

如果max(cnt)的值很大,需要多次去重操作。而且恰巧表TABLE很大,会耗费大量时间

这时可以先不执行删除操作,建立第二个临时表,所有有重复记录的数据select到表里

create table tmp_rid2 as select A,B,C,D,E,rowid rid from TABLE a where exists(select 1 from tmp_rid1 u where u.A=a.A and u.B=a.B and u.D=a.D);

然后删除

delete from TABLE where rowid in ( select rid from tmp_rid2 );

从临时表查询唯一记录插入到表TABLE

insert into TABLE select A,B,C,D,E from tmp_rid2 a where exists(select 1 from tmp_rid1 u where u.rid=a.rid);

再建唯一索引,一般不会返回ORA-01452报错了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值