Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1300720
  • 博文数量: 127
  • 博客积分: 2286
  • 博客等级: 大尉
  • 技术积分: 1943
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-10 10:37
文章分类

全部博文(127)

文章存档

2018年(1)

2015年(2)

2014年(1)

2013年(30)

2012年(88)

2011年(5)

分类: Oracle

2013-05-06 14:18:19

这里的主键包括唯一约束

 虽然建立主键必须要有个一个索引,很多时候还是唯一索引,我们就误以为唯一性是靠唯一索引来实现的。实际并不是这样的,因为主键可以关联到一个Non-Unique Index,同样来保证唯一性。所以我猜测(没有证据),唯一约束必须要有一个index仅仅是从效率上需求,插入一行的时候不用每次都做一次全表扫描。我有5点旁证:
1 唯一约束和唯一索引在oracle数据库单独存在
2 唯一约束可以不用唯一索引(效率怎么样就不知道呢)
3 没有唯一约束只有唯一索引,也可以保证唯一性
4 Disable或drop唯一约束的时候,对应的唯一索引也会被drop掉,但我们可以用keep index来保留,但是这样它还会保证唯一性,drop和disable就没有意义了

点击(此处)折叠或打开

  1. SQL> alter table emp add primary key (id);

  2. Table altered.

  3. SQL> select index_name,index_type,UNIQUENESS from user_indexes;

  4. INDEX_NAME INDEX_TYPE UNIQUENES
  5. ------------------------------ --------------------------- ---------
  6. SYS_C003774 NORMAL UNIQUE

  7. SQL> alter table emp drop constraint SYS_C003774 keep index;

  8. Table altered.

  9. SQL> select index_name,index_type,UNIQUENESS from user_indexes;

  10. INDEX_NAME INDEX_TYPE UNIQUENES
  11. ------------------------------ --------------------------- ---------
  12. SYS_C003774 NORMAL UNIQUE

5 如果约束定义为DEFERRABLE,还必须使用Non-Unique Index


点击(此处)折叠或打开

  1. SQL> alter table emp add primary key (id) INITIALLY DEFERRED DEFERRABLE;

  2. Table altered.

  3. SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,DEFERRABLE,DEFERRED from user_constraints;

  4. CONSTRAINT_NAME C DEFERRABLE DEFERRED
  5. ------------------------------ - -------------- ---------
  6. SYS_C003778 P DEFERRABLE DEFERRED

  7. SQL> insert into emp values (3,3);

  8. 1 row created.

  9. SQL> insert into emp values (3,3);

  10. 1 row created.

  11. SQL> commit;
  12. commit
  13. *
  14. ERROR at line 1:
  15. ORA-02091: transaction rolled back
  16. ORA-00001: unique constraint (ORACLE_OCM.SYS_C003778) violated


  17. SQL> alter table emp drop primary key;

  18. Table altered.

  19. SQL> drop index idx01;

  20. Index dropped.

  21. SQL> create unique index idx01 on emp(id);

  22. Index created.

  23. SQL> alter table emp add primary key (id) INITIALLY DEFERRED DEFERRABLE;
  24.  alter table emp add primary key (id) INITIALLY DEFERRED DEFERRABLE
  25. *
  26. ERROR at line 1:
  27. ORA-01408: such column list already indexed



阅读(1728) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~