-- 區別
主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。
主鍵建立後一定包含乙個唯一性索引,唯一性索引並不一定就是主鍵。
唯一性索引列允許空值,而主鍵列不允許為空值。
主鍵列在建立時,已經預設為空值 + 唯一索引了。
主鍵可以被其他表引用為外來鍵,而唯一索引不能。
乙個表最多只能建立乙個主鍵,但可以建立多個唯一索引。
主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。
在 rbo 模式下,主鍵的執行計畫優先順序要高於唯一索引。 兩者可以提高查詢的速度。
-- 建立一張僅包含主鍵和唯一索引的表
create table test
(primarykey varchar2(20),
uniquekey varchar2(20)
-- 分別建立主鍵和唯一索引,語法不同
alter table test add constraint test_primarykey primary key (primarykey);
create unique index test_uniquekey on test (uniquekey);
-- 在 user_indexes 中可以看到兩個索引名稱
select table_name,table_type,index_name,index_type,uniqueness
from user_indexes
where table_name='test';
-- 在 user_ind_columns 中可以看到兩個索引欄位名稱
select table_name,index_name,column_name,column_position
from user_ind_columns
where table_name='test';
-- 在 user_constraints 僅可以看到主鍵約束名稱
select table_name,constraint_name,constraint_type
from user_constraints
where table_name='test';
-- 在 user_cons_columns 僅可以看到主鍵約束欄位名稱
select table_name,constraint_name,column_name,position
from user_cons_columns
where constraint_name in (select constraint_name
from user_constraints
where table_name='test');
-- 為唯一索引增加乙個非空約束
alter table test modify uniquekey not null;
-- 在 user_constraints 僅可以看到主鍵約束名稱和非空約束名稱
select table_name,constraint_name,constraint_type
from user_constraints
where table_name='test'
-- 在 user_cons_columns 僅可以看到主鍵約束欄位名稱和非空約束欄位名稱
select table_name,constraint_name,column_name,position
from user_cons_columns
where constraint_name in (select constraint_name
from user_constraints
where table_name='test')
btree索引和hash索引的區別
在mysql中,大多數索引 如 primary key,unique,index和fulltext 都是在btree中儲存,但使用memory引擎可以選擇btree索引或者hash索引,兩種不同型別的索引各自有其不同的使用範圍。以下節選網摘 hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可...
b tree索引和hash索引的區別
昨晚重翻了 深入淺出mysql 再次檢視了一下印象模糊的btree索引和hash索引的區別。故此做一下筆記。在mysql中,大多數索引 如 primary key,unique,index和fulltext 都是在btree中儲存,但使用memory引擎可以選擇btree索引或者hash索引,兩種不...
聯合索引和單個索引的區別
聯合索引和單個索引的區別 如果我們建立了 area,age,salary 的復合索引,那麼其實相當於建立了 area,age,salary area,age area 三個索引,這被稱為最佳左字首 特性。因此我們在建立復合索引時應該將最常用作限制條件的列放在最左邊,依次遞減。例 select fro...