ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于唯一索引与唯一约束

关于唯一索引与唯一约束

原创 Linux操作系统 作者:xilangxiangwa 时间:2009-12-08 19:17:28 0 删除 编辑
唯一索引问题?

我们有一个表上有一个索引,本来应该是唯一的,当时没有建立它为唯一,现在已经出现重复记录,
我现在不想动这些记录,如何保证以后插入的数据唯一。


加个唯一约束,然后使用enable novalidate



 

SYS@oracle10g>create table test_unique(id int);

表已创建。

SYS@oracle10g>create index i_test_unique on test_unique(id);

索引已创建。

SYS@oracle10g>insert into test_unique values(1);

已创建 1 行。

SYS@oracle10g>/

已创建 1 行。

SYS@oracle10g>c /1/2/
  1* insert into test_unique values(2)
SYS@oracle10g>/

已创建 1 行。

SYS@oracle10g>commit;

提交完成。

SYS@oracle10g>select * from test_unique;

        ID
----------
         1
         1
         2


SYS@oracle10g>alter table test_unique add constraint k unique(id) enable novalidate;

表已更改。

SYS@oracle10g>insert into test_unique values(2);
insert into test_unique values(2)
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SYS.K)


QUOTE:
原帖由 dingjun123 于 2009-12-8 16:15 发表

哈哈,的确如此,必须先有索引,才能建这样的约束,不然不让你建

其实也并不是要先建立索引,才能建这样的约束。

而是因为创建唯一约束,或主键约束时,
ORACLE会自动创建一唯一索引,
创建唯一索引时ORACLE会自动检测是否存在重复的键值(即是否违反唯一约束)。
但如果同一列上已经建立了一个索引了,那么oracle将不再自动创建一唯一索引,
因为同一列上只能建立一个索引(在同一分区的前提下),所以也就不会进行唯一性检查。
而语句 "alter table test_unique add constraint k unique(id) enable novalidate;"
后的 enable novalidate 的作用只是为了建立约束时,不对已有的数据进行唯一性检查。

换言之,做这样的改动,
一要避免建立唯一约束本身时,对表中数据的唯一性的检查;(通过加enable novalidate子句)
二要避免自动建立唯一索引;(通过先建立非唯一索引,再建立唯一约束的方法);

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10595277/viewspace-621984/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 梦醒后......
请登录后发表评论 登录
全部评论

注册时间:2008-01-18

  • 博文量
    71
  • 访问量
    411422