ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 主键与索引关系实验

主键与索引关系实验

原创 Linux操作系统 作者:deszjj 时间:2012-06-07 10:34:48 0 删除 编辑

主键与索引关系实验   

增加主键时,如果主键列上存在唯一性索引,则主键直接使用该唯一性索引,如果主键列没有唯一性约束而有非唯一性索引,则使用非唯一性索引来确保主键的唯一特性。

以下为各种情况的详细实验记录:

情况1、当前表不存在索引
 步骤:创建表-->插入数据-->增加主键-->查看该表的索引情况
      
HR@ orcl >create table t(a number,b varchar2(20));
Table created.
HR@ orcl >insert into t values (1,'aaa');
1 row created.
HR@ orcl >insert into t values (2,'bbb');
1 row created.
HR@ orcl >commit;
Commit complete.
HR@ orcl >alter table t add constraint pk_t_a primary key (a);
Table altered.
HR@ orcl >select index_name ,table_name ,uniqueness from user_indexes
  2  where table_name = 'T';
INDEX_NAME                     TABLE_NAME                     UNIQUENES
------------------------------ ------------------------------ ---------
PK_T_A                         T                              UNIQUE
HR@ orcl >insert into t values (2,'bbb');
insert into t values (2,'bbb')
*
ERROR at line 1:
ORA-00001: unique constraint (HR.PK_T_A) violated
HR@ orcl >drop index PK_T_A;
drop index PK_T_A
          *
ERROR at line 1:
ORA-02429: cannot drop index used for enforcement of unique/primary key

 注:这种情况在增加主键的时候会自动创建以主键名命名的唯一性索引,说明主键约束需要使用唯一性索引来确保主键的唯一。
情况2、当前表存在唯一性索引
步骤:创建表-->创建唯一性索引-->增加主键-->查看该表的索引情况
HR@ orcl >drop table t;
Table dropped.
HR@ orcl >create table t(a number,b varchar2(20));
Table created.
HR@ orcl >insert into t values (1,'aaa');
1 row created.
HR@ orcl >insert into t values (2,'bbb');
1 row created.
HR@ orcl >commit;
Commit complete.
HR@ orcl >create unique index idx_unq_t_a on t(a);
Index created.
HR@ orcl >alter table t add constraint pk_t_a primary key (a);
Table altered.
HR@ orcl >select index_name ,table_name ,uniqueness from user_indexes
  2  where table_name ='T';
INDEX_NAME                     TABLE_NAME                     UNIQUENES
------------------------------ ------------------------------ ---------
IDX_UNQ_T_A                    T                              UNIQUE
HR@ orcl >insert into t values (2,'bbb');
insert into t values (2,'bbb')
*
ERROR at line 1:
ORA-00001: unique constraint (HR.PK_T_A) violated
HR@ orcl >drop index IDX_UNQ_T_A;
drop index IDX_UNQ_T_A
           *
ERROR at line 1:
ORA-02429: cannot drop index used for enforcement of unique/primary key

注:这种情况在创建主键的时候不用指定using index 选项,Oracle会自动查找指定到当前表的唯一性索引。

情况3、当前表不存在唯一性索引,存在非唯一性索引
步骤:创建表-->创建非唯一性索引-->增加主键-->查看该表的索引情况
HR@ orcl >drop table t;
Table dropped.
HR@ orcl >create table t(a number,b varchar2(20));
Table created.
HR@ orcl >insert into t values (1,'aaa');
1 row created.
HR@ orcl >insert into t values (2,'bbb');
1 row created.
HR@ orcl >commit;
Commit complete.
HR@ orcl >create index idx_t_a on t(a); --此处创建的是非唯一性索引
Index created.
HR@ orcl >alter table t add constraint pk_t_a primary key (a);
Table altered.
HR@ orcl >insert into t values (2,'bbb');
insert into t values (2,'bbb')
*
ERROR at line 1:
ORA-00001: unique constraint (HR.PK_T_A) violated
HR@ orcl >select index_name ,table_name ,uniqueness from user_indexes
  2  where table_name ='T';
INDEX_NAME                     TABLE_NAME                     UNIQUENES
------------------------------ ------------------------------ ---------
IDX_T_A                        T                              NONUNIQUE
HR@ orcl >drop index IDX_T_A;--此处删除非唯一性索引时候,报错,提示不能删除。
drop index IDX_T_A
           *
ERROR at line 1:
ORA-02429: cannot drop index used for enforcement of unique/primary key
注:这种情况在创建主键的时候,Oracle自动指定了一个非唯一性索引来进行主键约束,检查是否有重复值。

按理说只有唯一性约束才能确保主键的唯一特性,根据现在的实验结果,非唯一索引也能确保主键的唯一特性。以上仅根据实验结果,提出的个人观点,仅供参考,如有错误之处,敬请指出……

 

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

请登录后发表评论 登录
全部评论

注册时间:2012-04-07

  • 博文量
    42
  • 访问量
    116360