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

-----

constraint和index--转载的更多相关文章

  1. constraint、index、view(day04)

    回顾: 1.sql99中的表连接 select 字段列表 from 左表 {[inner]|{left|right|full} [outer]} join 右表 on 关联条件; 集合操作 union ...

  2. Oracle 唯一 约束(unique constraint) 与 索引(index) 关系说明

    一. 官网对Unique Constraints说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/datainte.h ...

  3. mysql key与index的区别

    key包含了index, 而index没有key的功能. 1.key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的).包括primary ...

  4. Mysql中Key与Index的区别

    mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的. 1 key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查 ...

  5. MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别

    参考:MySQL中KEY.PRIMARY KEY.UNIQUE KEY.INDEX 的区别 对于题目中提出的问题,可以拆分来一步步解决.在 MySQL 中 KEY 和 INDEX 是同义.那这个问题就 ...

  6. 【Mysql】key 、primary key 、unique key 与index区别

    参考:https://blog.csdn.net/nanamasuda/article/details/52543177 总的来说,primary key .unique key 这些key建立的同时 ...

  7. Mysql索引详解及优化(key和index区别)

    MySQL索引的概念    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库 ...

  8. 【Mysql优化】key和index区别

    mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的.    1).key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引 ...

  9. 数据库操作之——key与index的区别

    mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的. 1 key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查 ...

  10. mysql中 key 、primary key 、unique key 和 index 有什么不同

    mysql中 key .primary key .unique key 和 index 有什么不同 key 是数据库的物理结构,它包含两层意义和作用, 一是约束(偏重于约束和规范数据库的结构完整性), ...

随机推荐

  1. oracle for linux服务器磁盘空间不足,通过过期的文件释放磁盘空间

    --2013-09-16截取的数据-- 使用df-h命令查看系统磁盘空间 [root@erpdbs PROD]# df -h Filesystem Size Used Avail Use% Mount ...

  2. [Windows Server 2008] 安装Apache+PHP+MySQL

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Win2008 ...

  3. 可以用作javascript异步模式的函数写法

    1. 回调函数 f1(); f2(); function f1(callback) { setTimeout(function() { // f1的任务代码 callback(); }, 1000); ...

  4. Windows环境下flask+Apache+mod_wsgi部署及爬坑

    文章目录 安装python Windows 环境使用virtualenv和virtualenvwrapper 安装mod_wsgi 安装nginx 安装Apache 遇到的坑 安装Apache遇到的坑 ...

  5. 第十节:numpy之数组文件操作

    1.安装ipython 2.创建txt文件 3.直接上代码:

  6. Keil-MDK编译完成后代码大小

    Code 代表执行的代码,程序中所有的函数都位于此处. RO-data 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处. RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局 ...

  7. jdk8--十大新特性

    https://www.cnblogs.com/dennyzhangdd/p/6722445.html 一.十大特性 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方 ...

  8. 【codeforces 508C】Anya and Ghosts

    [题目链接]:http://codeforces.com/contest/508/problem/C [题意] 每秒钟可以点一根蜡烛; 这根蜡烛会燃烧t秒; 然后会有m只鬼来拜访你; 要求在鬼来拜访你 ...

  9. 【codeforces 508B】Anton and currency you all know

    [题目链接]:http://codeforces.com/contest/508/problem/B [题意] 给你一个奇数; 让你交换一次数字; 使得这个数字变成偶数; 要求偶数要最大; [题解] ...

  10. noip模拟赛 fateice-or

    分析:or操作只有在结果的这一位为0的情况下才会强制要求两个数的这一位都为0,其它时候不强求,所以为了最大限度地满足条件,我们先把所有的数的所有位全部变成1,如果p的第i位为0,那么[l,r]的数的第 ...