T 表中的 id 字段原来有唯一性索引, 被误删后导致数据有重复
在不能停机的情况下, 按照下面的步骤删除重复数据, 并重建唯一性索引
1. 建立普通索引
create index t_idx on t(id) online;
select index_name,table_name from user_indexes where table_name='T';
2. 创建主键
因为原数据中存在主键重复的键值, 直接创建主键会报错, 需要加 enable novalidate 来忽略旧数据的重复验证
之后插入的新数据会做验证
利用 using index 来使用之前创建的索引而不由主键创建隐含索引, 此处也可以创建唯一索引
alter table t add constraint t_pk primary key (id) using index t_idx enable novalidate;
select index_name,table_name from user_indexes where table_name='T';
select constraint_name,constraint_type,table_name from user_constraints where table_name='T';
3. 删除重复数据
delete from t a where a.rowid not in (select min(b.rowid) from t b group by b.id having count(b.id)>1) and a.id in (select id from t b group by b.id having count(b.id)>1)
4. 使主键的验证生效 (针对旧数据)
alter table t modify constraint t_pk enable validate;
0 件のコメント:
コメントを投稿