this is a extra element for clear the floated element
在已有冗余的表上加唯一约束
  • 12/31
  • 2008
开发技术 | Oracle 1495 次查看
  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

  
您可能感兴趣的:

更多相关内容