前几天还被人问起有没有什么方法在已有冗余的表上加唯一约束; 当然要删除冗余的数据了;我告诉他
SELECT * FROM emp a
WHERE rowid > ANY
(SELECT rowid FROM emp b
WHERE aename = bename
)
可以找到冗余的数据
今个发现还有一个比较简便的方法如下使用 exceptions into exceptions;
SQL> create table t ( a int b int c int );
表已创建
SQL> insert into t select rownumrownum+rownum+ from all_objects where rownum
<;
已创建行
SQL> insert into t select *from t where rownum<;
已创建行
SQL> commit;
提交完成
SQL> select *from t;
ABC
已选择行
SQL> create table exceptions(row_id rowid
owner varchar()
table_name varchar()
constraint varchar());
表已创建
SQL>
SQL> alter table t add constraint t_unique
unique(abc) exceptions into exceptions;
alter table t add constraint t_unique
*
ERROR 位于第 行:
ORA: 无法验证 (EPUSERT_UNIQUE) 未找到重复关键字
SQL> create table dups
as select *from t where rowid in (select row_id from exceptions);
表已创建
SQL> select *from dups;
ABC
SQL> select row_id from exceptions;
ROW_ID
AAAIEJAAKAAAyMSAAA
AAAIEJAAKAAAyMSAAE
AAAIEJAAKAAAyMSAAB
AAAIEJAAKAAAyMSAAF
SQL> delete from t where rowid in ( select row_idfrom exceptions );
已删除行
SQL> insert into t select distinct * from dups;
已创建行
SQL>
SQL> commit;
提交完成
SQL> select *from t;
ABC