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

-----

时间: 2024-10-09 16:52:00

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

index(转载)

index 匆忙并致歉 1,晚上录完节目更新. 人在现场,但是不上台,没办法,手非常碍事. 2,留言问题. <如果还有明天>是刘伟仁词曲,但身患绝症的是薛岳,而不是刘.薛这个歌手很传奇,当年台湾顶尖音乐人. 一个即将离开的歌手,唱着如果还有明天,唱着唱着哽咽了,说,我唱不下去了我唱不下去了. 所以这首歌属于太多太多人. 做的节目是<娱乐818>. 今天晚上播出摔伤的那期节目. 片子做完后,老子一格一格慢动作看过去,惊喜地发现,腾空的那一刹那,双脚同时收拢,身体最下方应该算左脚脚底.

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

一. 官网对Unique Constraints说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/datainte.htm#CNCPT1642 uniquekey constraint requires that every value in a column or set of columns beunique. No rows of a table may have duplicate values in a

mysql的key和index

关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针. 下面是主键和索引的一些区别与联系: 1. 主键一定是唯一性索引,唯一性索引并不一定就是主键. 所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引.因为主键可以唯一标识某一行记录,所以可以确保执行数据更新.删除

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

MySQL索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了:聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快 要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件.对于一个经常需要更新和插入的表格,就没有必要为

Mysql中Key与Index的区别

mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的. 1 key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的).包括primary key, unique key, foreign key 等. primary key 有两个作用,一是约束作用(constraint),用来规范一个存储主键和唯一性,但同时也在此key上建立了一个index: unique key 也有两个作用,一是约束作用(cons

[MySQL Reference Manual]14 InnoDB存储引擎

14 InnoDB存储引擎 14 InnoDB存储引擎... 1 14.1 InnoDB说明... 5 14.1.1 InnoDB作为默认存储引擎... 5 14.1.1.1 存储引擎的趋势... 5 14.1.1.2 InnoDB变成默认存储引擎之后... 5 14.1.1.3 InnoDB表好处... 6 14.1.1.4 InnoDB表最佳实践... 6 14.1.1.5 InnoDB表提升... 6 14.1.1.6 InnoDB作为默认存储引擎测试... 6 14.1.1.7 验证In

carousel

<!DOCTYPE html> <html lang="en" ng-app="mainApp"> <head> <meta charset="utf-8"> <!-- add styles --> <link href="css/style.css" rel="stylesheet" type="text/css" /&

GossipView:圆圈布局的自定义view

当我们想展示一个数组形式的数据的时候,要么是使用列表的形式,要么是使用网格的形式,今天我们介绍一种奇葩的形式,圆圈形式: 注意,周边的扇形是可以点击的.如果使用现有控件,要实现起来是有难度的,所以我们就采用了自定义View的方式. 下面是原理以及使用方法,整个项目可以到这里下载:https://github.com/jianghejie/GossipView 绘制 主要是外部扇形以及内部圆圈背景的绘制,最里面其实还有个很细的圆圈,那个其实是用在当想显示加载效果的时候,但这不是重点略去不讲. 内部

细说Nullable&lt;T&gt;类型

目录一.简介二.语法和用法三.类型的转换和运算四.装箱与拆箱五.GetType()方法六.ToString()方法七.System.Nullable帮助类八.语法糖 一.简介 众所周知,值类型变量不能null,这也是为什么它们被称为值类型.但是,在实际的开发过程中,也需要值为null的一些场景.例如以下场景: 场景1:您从数据库表中检索可空的整数数据列,数据库中的null值没有办法将此值分配给C#中Int32类型: 场景2:您在UI绑定属性,但是某些值类型的字段不是必须录入的(例如在人员管理中的

敏捷项目开源管理软件ScrumBasic(2)- 多项目支持

1.加入Project对象模型 public class Project { [Key] [MaxLength(32)] public string ID { get; set; } public string Name { get; set; } public int Order { get; set; } public ICollection<UserStory> Stories { get; set; } public ApplicationUser Creator { get; set