Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系

版权声明:本文发布于,版权由Yumiko_sunny所有,欢迎转载。转载时,请在文章明显位置注明原文链接。若在未经作者同意的情况下,将本文内容用于商业用途,将保留追究其法律责任的权利。如果有问题,请以邮箱方式联系作者(793113046@qq.com)。

Oracle唯一索引、普通索引及约束的关系

在总结索引扫描类型前(不同于前面总结的五大类索引类型索引类型主要是索引类别的划分,而引扫描类型是索引在进行索引扫描时的具体方法),需要了解唯一索引、非唯一索引(普通索引)以及约束的关系。这是因为对于索引扫描类型的具体探讨上,需要根据“唯一索引”、“非唯一索引(普通索引)”以及“约束”,这三个概念的具体情况,进行具体说明,因此优先进行总结。

1、唯一索引与普通索引的概述

对于索引,如b-tree索引,可以根据具体的情况,可以创建唯一索引(create unique index)或者普通索引(create index)。

默认情况下,通过create index 创建的索引,属于非唯一索引。

2、唯一索引与普通索引的区别

对于唯一索引与普通索引,最大的区别在于:

1)对于存在唯一索引的索引列,该列相当于增加了唯一约束。既该列的列值必须唯一,null值除外。

2)对于存在唯一索引的索引列,该列的列值可以为空。但主键约束(约束列值唯一且非空)的列不能有空值。

示例:

准备两张结构、数据相同的表test_normal、test_primary,然后针对empno列,分别添加普通索引和唯一索引,观察约束情况。

--查看两张表上的约束情况,此时两张表无任何约束
Yumiko@Sunny >select a.TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,a.STATUS CONSTRAINT_STATUS, 2 b.INDEX_NAME,UNIQUENESS INDEX_UNIQUENESS 3 from user_constraints a,user_indexes b 4 where a.INDEX_NAME=b.INDEX_NAME and a.TABLE_NAME like \'%TEST_%\'; no rows selected --为表test_normal的empno列,创建普通索引 Yumiko@Sunny >create index ind_test_normal_empno on test_normal(empno); Index created. --为表test_primary的empno列,创建唯一索引 Yumiko@Sunny >create unique index ind_test_primary_empno on test_primary(empno); Index created.
--通过视图user_indexes,确认两个创建索引的唯一性
--可以看到不加unique创建的索引属于非唯一的b-tree索引(index_type列未列出,此时应显示为normal)
--而加unique参数的索引属于唯一索引 Yumiko
@Sunny >select index_name,table_name,UNIQUENESS from user_indexes where table_name like \'TEST_%\'; INDEX_NAME TABLE_NAME UNIQUENES ------------------------------ ------------------------------ --------- IND_TEST_PRIMARY_EMPNO TEST_PRIMARY UNIQUE IND_TEST_NORMAL_EMPNO TEST_NORMAL NONUNIQUE
--查看此时的两张表的约束情况,未发现明显的约束建立
Yumiko
@Sunny >select a.TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,a.STATUS CONSTRAINT_STATUS, 2 b.INDEX_NAME,UNIQUENESS INDEX_UNIQUENESS 3 from user_constraints a,user_indexes b 4 where a.INDEX_NAME=b.INDEX_NAME and a.TABLE_NAME like \'%TEST_%\'; no rows selected --下面通过数据操作,验证创建唯一索引,对于列值的产生了唯一约束


--查询创建普通索引的表test_normal的第一行数据,并插入相同的数据行信息
Yumiko
@Sunny >select * from TEST_NORMAL where rownum=1; EMPNO ENAME JOB SAL ---------- ---------- --------- ---------- 7369 SMITH CLERK 800
Yumiko
@Sunny >insert into TEST_NORMAL values(7369,\'aaa\',\'aaaaa\',1000); 1 row created. --此时数据插入成功

--查询创建唯一索引的表test_primary的第一行数据,同样插入相同的数据行信息 Yumiko
@Sunny >select * from TEST_PRIMARY where rownum=1; EMPNO ENAME JOB SAL ---------- ---------- --------- ---------- 7369 SMITH CLERK 800 Yumiko@Sunny >insert into TEST_PRIMARY values(7369,\'aaa\',\'aaaaa\',1000); insert into TEST_PRIMARY values(7369,\'aaa\',\'aaaaa\',1000) * ERROR at line 1: ORA-00001: unique constraint (SCOTT.IND_TEST_PRIMARY_EMPNO) violated --此时插入数据失败,并报ora-00001唯一键约束冲突的错误
--此处证明了,当创建唯一索引时,会为该列增加唯一约束

--为存在唯一索引的表test_primary,插入两条索引列存在null值的数据行 Yumiko@Sunny >insert into TEST_PRIMARY values(null,\'aaa\',\'aaaaa\',1000); 1 row created. Yumiko@Sunny >insert into TEST_PRIMARY values(null,\'bbb\',\'bbbbb\',1000); 1 row created.
--此处证明了对于唯一索引,在数据列没有非空约束的前提下,可以插入空值,且可以插入多个空值。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypdpj.html