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