日期:2013-08-23  浏览次数:20613 次



平时任务中可能会遇到当试图对库表中的某一列或几列创建独一索引时,系统提示 ORA-01452 :不能创建独一索引,发现反复记录。

下面总结一下几种查找和删除反复记录的方法(以表CZ为例):
表CZ的结构如下:
SQL> desc cz
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------------

 C1                                                 NUMBER(10)
 C10                                                NUMBER(5)
 C20                                                VARCHAR2(3)

删除反复记录的方法原理:
(1).在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是独一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。

(2).在反复的记录中,可能所有列的内容都相反,但rowid不会相反,所以只需确定出反复记录中那些具有最大rowid的就可以了,其余全部删除。

反复记录判断的标准是:
C1,C10和C20这三列的值都相反才算是反复记录。

经查看表CZ总共有16条记录:
SQL>set pagesize 100
SQL>select * from cz;

         C1        C10 C20
---------- ---------- ---
         1          2   dsf
         1          2   dsf
         1          2   dsf
         1          2   dsf
         2          3   che
         1          2   dsf
         1          2   dsf
         1          2   dsf
         1          2   dsf
         2          3   che
         2          3   che
         2          3   che
         2          3   che
         3          4   dff
         3          4   dff
         3          4   dff