唯一性約束通過唯一性索引來實現?我覺得這說法不對。
對於唯一性約束,索引是必須存在的,唯一性約束本質上是通過索引來保證的,但不一定是唯一性索引。
唯一性約束允許有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 唯一性約束用來限制不受主鍵約束的列上...