• constraint和index--转载


    primary key和unique约束是要依赖index的,下面通过试验来看看他们之间的依赖关系!
     
     
     
    SQL> select * from tt;
     
    ID NA
    ---------- --
    1 a
    2 b
    3 c
    4 d
    5 e
    6 f
    1000 h
     
    已选择7行。
    SQL> alter table tt add constraint pk_tt primary key (id);
     
    表已更改。
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    INDEX_NAME TABLE_NAME UNIQUENES STATUS
    ------------------------------ ------------------------------ --------- --------
     
    PK_TT TT UNIQUE VALID
     
    SQL> alter table tt add constraint uni_tt unique (name);
     
    表已更改。
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    INDEX_NAME TABLE_NAME UNIQUENES STATUS
    ------------------------------ ------------------------------ --------- --------
     
    PK_TT TT UNIQUE VALID
    UNI_TT TT UNIQUE VALID
     
    /*我们都知道在创建primary key和unique约束的时候系统自动会创建unique index,
    上面的测试也验证了这一点。不过通过这种方式创建的index存在一点问题那就是
    当constraint被disable的时候,index被drop了!而当constraint被enable时index
    又被重新创建,如果在一个高可用的系统的一个大表上做这样的操作时要慎重,因为
    创建index是要产生lock的。*/
    SQL> alter table tt disable constraint pk_tt;
     
    表已更改。
     
    SQL> alter table tt disable constraint uni_tt;
     
    表已更改。
     
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    未选定行
     
    SQL> alter table tt enable constraint pk_tt;
     
    表已更改。
     
    SQL> alter table tt enable constraint uni_tt;
     
    表已更改。
     
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    INDEX_NAME TABLE_NAME UNIQUENES STATUS
    ------------------------------ ------------------------------ --------- --------
     
    PK_TT TT UNIQUE VALID
    UNI_TT TT UNIQUE VALID
    --当约束(primary key 和unique)被删除时,伴随着约束的创建而被创建的index也随之被删除!
    SQL> alter table tt drop constraint pk_tt;
     
    表已更改。
     
    SQL> alter table tt drop constraint uni_tt;
     
    表已更改。
     
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    未选定行
    /*如果事先在要创建约束(primary key 和unique)的列上存在非唯一index,那么创建约束时oracle会自动使用该index而不会重新创建;以这种方式存在的index的好处是约束被disable之后index依然存在并且处于valid状态或者说当约束由disable变成enable时index不需要被重建;如果事先存在唯一index,那么在这样的列上创建constraint时尽管也可以使用该唯一index,但是当把constraint变成disable状态时index还是被删除了,也就是说当再次enable 约束时index还是需要重新创建的。所以把constraint和非唯一index结合起来何尝不是一种好的做法。这样如果使用非唯一index,那么在一个大表上把约束从enable状态变成disable状态可以大大降低时间,因为不需要重建index;另外的好处就是当constraint被drop之后index依然存在而且有效*/
    SQL> create index idx_tt_id on tt(id);
     
    索引已创建。
     
    SQL> create index idx_tt_name on tt(name);
     
    索引已创建。
     
    SQL> alter table tt add constraint pk_tt primary key (id);
     
    表已更改。
     
    SQL> alter table tt add constraint uni_tt unique (name) using index idx_tt_name;
     
     
    表已更改。
     
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    INDEX_NAME TABLE_NAME UNIQUENES STATUS
    ------------------------------ ------------------------------ --------- --------
     
    IDX_TT_ID TT NONUNIQUE VALID
    IDX_TT_NAME TT NONUNIQUE VALID
     
    SQL> alter table tt disable constraint pk_tt;
     
    表已更改。
     
    SQL> alter table tt disable constraint uni_tt;
     
    表已更改。
     
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    INDEX_NAME TABLE_NAME UNIQUENES STATUS
    ------------------------------ ------------------------------ --------- --------
     
    IDX_TT_ID TT NONUNIQUE VALID
    IDX_TT_NAME TT NONUNIQUE VALID
     
    SQL> alter table tt enable constraint pk_tt;
     
    表已更改。
     
    SQL> alter table tt enable constraint uni_tt;
     
    表已更改。
     
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    INDEX_NAME TABLE_NAME UNIQUENES STATUS
    ------------------------------ ------------------------------ --------- --------
     
    IDX_TT_ID TT NONUNIQUE VALID
    IDX_TT_NAME TT NONUNIQUE VALID
    --index一旦被约束所依赖,那么该index将不能被删除
    SQL> drop index idx_tt_id ;
    drop index idx_tt_id
    *
    第 1 行出现错误:
    ORA-02429: 无法删除用于强制唯一/主键的索引
     
     
    SQL> drop index idx_tt_name;
    drop index idx_tt_name
    *
    第 1 行出现错误:
    ORA-02429: 无法删除用于强制唯一/主键的索引
     
     
    SQL> alter table tt drop constraint pk_tt;
     
    表已更改。
     
    SQL> alter table tt drop constraint uni_tt;
     
    表已更改。
     
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    INDEX_NAME TABLE_NAME UNIQUENES STATUS
    ------------------------------ ------------------------------ --------- --------
     
    IDX_TT_ID TT NONUNIQUE VALID
    IDX_TT_NAME TT NONUNIQUE VALID
     
    SQL> drop index idx_tt_id ;
     
    索引已删除。
     
    SQL> drop index idx_tt_name;
     
    索引已删除。
     
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    未选定行
    --再来看看复合index的情况:当在前导列上创建约束(primary key and unique)时,复合索引
    依然可以被primary key所依赖而不许创建uniqie index,但是当不在index的前导列上创建
    约束时此时存在的复合index就不能被约束所依赖!
    SQL> create index idx_tt_id_name on tt(id , name);
     
    索引已创建。
     
    SQL> alter table tt add constraint pk_tt primary key (id);
     
    表已更改。
     
    SQL> alter table tt add constraint uni_tt unique (name) ;
     
    表已更改。
     
    SQL> select index_name,table_name,uniqueness,status from user_indexes where tabl
    e_name='TT';
     
    INDEX_NAME TABLE_NAME UNIQUENES STATUS
    ------------------------------ ------------------------------ --------- --------
     
    IDX_TT_ID_NAME TT NONUNIQUE VALID
    UNI_TT TT UNIQUE VALID
     
    SQL> alter table tt drop constraint uni_tt;
     
    表已更改。
     
    SQL> alter table tt add constraint uni_tt unique (name) using index idx_tt_id_na
    me;
    alter table tt add constraint uni_tt unique (name) using index idx_tt_id_name
    *
    第 1 行出现错误:
    ORA-14196: 指定的索引不能用于强制约束条件。
     
     
    SQL>
     
     
     
     
     
     
     
     

    从Oracle9i开始,主键创建时的索引和唯一性约束可以在建表时独立定义。 随后,约束可以被独立drop,而索引可以保留。这是Oracle9i中对于索引增强的几个特性之一。

    SQL> CREATE TABLE employees
      2  (
      3    empno NUMBER(6),
      4    NAME VARCHAR2(30),
      5    dept_no NUMBER(2),
      6    CONSTRAINT emp_pk PRIMARY KEY(empno)
      7      USING INDEX
      8      (CREATE UNIQUE INDEX emp_pk_idx ON employees(empno))
      9  );
    Table created.
    SQL> select index_name,UNIQUENESS from user_indexes
      2  where table_name=upper('employees');
    INDEX_NAME                     UNIQUENES
    ------------------------------ ---------
    EMP_PK_IDX                     UNIQUE
    SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,INDEX_NAME from user_constraints
      2  where table_name=upper('employees');
    CONSTRAINT_NAME                C INDEX_NAME
    ------------------------------ - ------------------------------
    EMP_PK                         P EMP_PK_IDX 

    Oracle9i中新增的命令可以用以DROP约束保留索引.

    ALTER TABLE employees DROP PRIMARY KEY KEEP INDEX;

    SQL> ALTER TABLE employees DROP PRIMARY KEY KEEP INDEX;
    Table altered.
    SQL> select index_name,UNIQUENESS from user_indexes
      2  where table_name=upper('employees');
    INDEX_NAME                     UNIQUENES
    ------------------------------ ---------
    EMP_PK_IDX                     UNIQUE 

    对于隐式创建的主键索引,同样可以使用此种方式保留:

    SQL> CREATE TABLE employees
      2  (
      3    empno NUMBER(6) primary key,
      4    NAME VARCHAR2(30),
      5    dept_no NUMBER(2)
      6  );
    Table created.
    SQL> ALTER TABLE employees DROP PRIMARY KEY KEEP INDEX;
    Table altered.
    SQL> select index_name,UNIQUENESS from user_indexes
      2  where table_name=upper('employees');
    INDEX_NAME                     UNIQUENES
    ------------------------------ ---------
    SYS_C004180                    UNIQUE
    -----
  • 相关阅读:
    解决mybatis xml文件代码提示
    SVN cleanup failed–previous operation has not finished; run cleanup if it was interrupted
    有36辆自动赛车和6条跑道,没有计时器的前提下,最少用几次比赛可以筛选出最快的三辆赛车?
    mybatis如何在控制台打印执行的sql语句
    Ionic2如何下拉刷新和上拉加载
    Ionic 如何把左上角的按钮去掉?
    Ionic1与Ionic2
    java的四种引用,强弱软虚
    equals变量在前面或者在后面有什么区别吗?这是一个坑点
    Java基础—复用类
  • 原文地址:https://www.cnblogs.com/zwl715/p/4134620.html
Copyright © 2020-2023  润新知