Oracle唯一性約束和唯一性索引的關係

2021-10-21 17:36:30 字數 3770 閱讀 6130

唯一性約束通過唯一性索引來實現?我覺得這說法不對。

對於唯一性約束,索引是必須存在的,唯一性約束本質上是通過索引來保證的,但不一定是唯一性索引。

唯一性約束允許有null值,唯一性約束的列可允許有多個null值。唯一性約束通過btree索引實現,而btree索引是不會包含null值,但使用null值過濾時不會走索引。

在沒有索引的情況下,建立唯一性約束會自動建立乙個唯一性索引,但oracle官方建議將唯一性約束和索引分開,這該怎麼理解呢?原來在建立唯一性約束時預設建立的唯一性索引會隨著唯一性約束disable或drop而刪除,我們以三個實驗來證明這個結論。

通過建立唯一性約束時預設建立唯一性索引,之後disable唯一性約束,觀察唯一性索引是否還存在。

create

table

test(id

number

, name

varchar2(30

)); alter

table

test

addconstraint

con_test_id_uq

unique(id

); 檢視索引

select

index_name, uniqueness, index_type

from

user_indexes

where

table_name =

'test';

可以看到,預設建立了乙個同名的唯一性索引

檢視唯一性約束

select

owner, constraint_name, table_name,

generated

, index_name

from

user_constraints

where

table_name =

'test';

唯一性約束con_test_id_uq繫結了唯一性索引con_test_id_uq

我們disable這個唯一性約束。

alter

table

test

disable

constraint

con_test_id_uq;

再次檢視約束

再次檢視索引,發現con_test_id_uq索引已經不見了

先建立唯一性索引,然後建立唯一性約束,之後disable唯一性約束,觀察唯一性索引是否還存在。

create

table

test1 (

idnumber

, name

varchar2(30

)); create

unique

index

idx_test1_id_uq

ontest1(

id);

alter

table

test1

addconstraint

con_test1_id_uq

unique(id

); 檢視唯一性索引

檢視唯一性約束

select

owner, constraint_name, table_name,

generated

, index_name

from

user_constraints

where

table_name =

'test1';

可以看到,唯一性約束con_test1_id_uq與唯一性索引idx_test1_id_uq繫結起來了。

我們disable這個唯一性約束con_test1_id_uq,再次檢視唯一性約束和索引的情況,發現唯一性索引仍存在。

先建立普通索引,然後建立唯一性約束,觀察唯一性約束是否能成功建立。之後disable唯一性約束,觀察索引是否還存在。

create

table

test2 (

idnumber

, name

varchar2(30

)); create

index

idx_test2_id

ontest2(

id);

alter

table

test2

addconstraint

con_test2_id_uq

unique(id

); 檢視索引

檢視唯一性約束

select

owner, constraint_name, table_name,

generated

, index_name

from

user_constraints

where

table_name =

'test2';

發現唯一性約束con_test2_id_uq也建立成功了,並且和普通索引idx_test2_id繫結了。

我們disable唯一性約束con_test2_id_uq,檢視唯一性約束和索引的情況,發現普通索引idx_test2_id也仍存在。

由以上實驗我們可以得出以下幾個結論。

建立唯一性約束時預設建立的唯一性索引會隨著唯一性約束disable或drop消失。

建立唯一性約束並不一定會建立索引,也可以使用現有的索引;

唯一性約束並不一定需要唯一性索引;

在生產環境中,如果使用預設的唯一性索引,當唯一性約束需要disable時,索引失效將會造成很大的問題,所以建議將唯一性約束與索引分開。

Oracle 12 唯一性約束

前言 唯一性約束和主鍵的區別 主鍵 primary key 所有組成主鍵的列都不能包含空值。唯一性約束 unique constraint 如果唯一性約束由多列組成,其中的部分列可以包含空值。oracle中不容許在相同列上既建立主鍵又建立唯一性約束,主鍵本來就具有唯一性。正文 1,建立表時同時建立唯...

mysql 唯一約束 Mysql 唯一性約束新增

一 單列唯一約束 1.建表時加上唯一性約束 create table t user id int 11 not null auto increment,username varchar 18 not null unique,password varchar 18 not null,primary k...

主鍵約束和唯一性約束的區別

1.主鍵約束 primary key 1 主鍵用於唯一地標識表中的每一條記錄,可以定義一列或多列為主鍵。2 是不可能 或很難 更新 3 主鍵列上沒有任何兩行具有相同值 即重複值 不允許空 null 4 主健可作外健,唯一索引不可 2.唯一性約束 unique 1 唯一性約束用來限制不受主鍵約束的列上...