熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

TIP 如何為表加唯一約束(保存或者刪除冗余的數據)

2013-11-13 22:20:35  來源: Oracle 

  前幾天還被人問起有沒有什麼方法在已有冗余的表上加唯一約束; 當然要刪除冗余的數據了;我告訴他
  
  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;
  
       A     B     C
  
                 
                 
                 
                 
                 
                 
  
  已選擇
  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;
  
       A     B     C
  
                 
                 
                 
                 
  
  SQL> select row_id from exceptions;
  
  ROW_ID
  
  AAAIEJAAKAAAyMSAAA
  AAAIEJAAKAAAyMSAAE
  AAAIEJAAKAAAyMSAAB
  AAAIEJAAKAAAyMSAAF
  
  SQL> delete from t where rowid in ( select row_id  from exceptions );
  
  已刪除
  
  SQL> insert into t select distinct * from dups;
  
  已創建
  
  SQL>
  SQL> commit;
  
  提交完成
  
  SQL> select *from t;
  
       A     B     C
  
                 
                 
                 
                 
  
  

From:http://tw.wingwit.com/Article/program/Oracle/201311/18829.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.