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报错了。
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报错了。