从Oracle索引的特征上,我们可以简单的把索引分为Unique Indexes and Nonunique Indexes,即唯一索引和非唯一索引。
1 对于唯一索引,唯一索引确保被索引的字段或多个联合字段在表中绝对不会有重复值;通常,我们在建表时,创建唯一约束或者主键约束,再或者建表以后给表添加唯一、主键约束时,Oracle会自动在主键、唯一约束的字段上创建唯一索引,并且索引的名字跟约束的名字一样,如:
1
2
3
4
5
6
7
8
9
10
11
12
|
SQL>
create
table
tt(id1 number
primary
key
,id2 number,id3 number);
Table
created.
SQL>
select
index_name,table_name,uniqueness
from
user_indexes
where
table_name=
'TT'
;
INDEX_NAME TABLE_NAME UNIQUENESS
------------------------------ ------------------------------ ----------
SYS_C0015420 TT
UNIQUE
SQL>
select
table_name,constraint_name,index_name,constraint_type
2
from
user_constraints
3
where
table_name=
'TT'
;
TABLE_NAME CONSTRAINT_NAME INDEX_NAME CONSTRAINT_TYPE
-------------- ---------------- ------------- ---------------
TT SYS_C0015420 SYS_C0015420 P
|
我们在建测试表tt时在id1字段上创建了一个主键约束,当然该约束名字SYS_C0015420是Oracle自动分配给我们的,同时我们也看到tt表上有1个名为SYS_C0015420的索引。
接下来,在id2字段上添加一个唯一约束,并且手动指定名字:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
SQL>
alter
table
tt
add
constraint
tt_id2_uk
unique
(id2);
Table
altered.
SQL>
select
table_name,constraint_name,index_name,constraint_type
2
from
user_constraints
3
where
table_name=
'TT'
;
TABLE_NAME CONSTRAINT_NAME INDEX_NAME C
------------------------------ ------------------------------ ------------------------------ -
TT SYS_C0015420 SYS_C0015420 P
TT TT_ID2_UK TT_ID2_UK U
SQL>
select
index_name,table_name,uniqueness
from
user_indexes
where
table_name=
'TT'
;
INDEX_NAME TABLE_NAME UNIQUENES
------------------------------ ------------------------------ ---------
TT_ID2_UK TT
UNIQUE
SYS_C0015420 TT
UNIQUE
SQL>
|
我们发现,这tt表上的两个索引都是唯一索引,且名字都等同于各自对应的约束名字。
然后,在该表上创建一个索引:
1
2
3
4
5
6
7
8
9
|
SQL>
create
index
idx_tt_id3
on
tt(id3);
Index
created.
SQL>
select
index_name,table_name,uniqueness
from
user_indexes
where
table_name=
'TT'
;
INDEX_NAME TABLE_NAME UNIQUENES
------------------------------ ------------------------------ ---------
IDX_TT_ID3 TT NONUNIQUE
TT_ID2_UK TT
UNIQUE
SYS_C0015420 TT
UNIQUE
SQL>
|
此时,发现该索引IDX_TT_ID3是一个非唯一索引,我们也可以使用create unique index...语句显示创建一个唯一索引。
就唯一索引存储而言,每一个rowid会唯一对应表中的一条记录,在索引的叶子块儿中,数据按照索引字段升序存放。
2 对于非唯一索引,允许被索引的字段有重复值。并且,非唯一索引的存放有别于唯一索引,它的数据在索引叶子块儿中是按照索引字段和rowid进行升序存放的。
参考文章:http://www.oracleonlinux.cn/2011/11/oracle-11g-concepts-notes2/