TIP 如何為表加唯一約束(保存或者刪除冗余的數據)
2024-07-21 02:38:05
供稿:網友
前幾天還被人問起有沒有什么方法,在已有冗余的表上加唯一約束; 當然要刪除冗余的數據了;我告訴他
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