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