数据表A1结构如下
A1(cola int primary key,
   colb char(10));A1表原有数据:
COLA COLB
---- ----
1 A
2 A
3 A
4 A
5 A
后新增数据,新增后A1表中数据如下:
COLA COLB
---- ----
1 A
2 A
3 A
4 A
5 A
1 B
2 B
3 B
//也许你会问,既然有主键,那些违反主键唯一约束的数据是怎么进去的.是用sqlldr的direct方式导入的
在产生这些重复数据后,做类似select * from A1 where cola=..的操作,会报错:
index "SYS_C002764" or partition of such index is in unusable state ////错误提示于是,我试图基于rowid删除那些违反主键约束规则的数据,用了几种方法:
1. delete from a1 a where rowid != (select min(rowid) from a1 b where a.cola=b.cola);
操作失败,报错同上
2. alter table a1 enable primary key exceptions into exceptions;
但是select * from exceptions发现exceptions表中并无数据 ////这个是为什么???我的问题是:
1. 该如何删除那些重复的记录?该表的DML操作好像都不被允许了
2. 在试图把重复数据扔入exceptions表,为什么exceptions表中没有数据?

解决方案 »

  1.   

    另外 索引也不允许被删除或者rebuild
    删除报错如下:ORA-02429: 无法删除用于强制唯一/主键的索引
      

  2.   

    现在不是索引的问题~而是你的PK约束已经被sqlldr给disable了 , 但导完数据,又enable不了, 因为已经有重复数据.  但是不管怎么说, 也没必要用到什么row-id来删记录吧~ 
    直接删PK那一列重复的记录不就行了么~
      

  3.   

    to: sozdream()觉得应该是像你分析的那样.但是直接删除PK那列也是删不掉的,所有DML操作都不被允许了,总是报同样的错误:index "SYS_C002764" or partition of such index is in unusable state
    另外,你说不用rowid,我怎么定位删那些重复的记录(因为我要的效果是对于重复的记录,删除重复的,删除多余的,保留一条,不是全部删除)