Primary key、unique、index之間的關系


參考文獻

Difference between an Index and a Primary Key

本質區別

首先primary key跟unique都是Constraints,屬於logical object,而index則是physical object,會占用index page並被保存在磁盤上。

Primary key Constraints和unique Constraints

Primary key Constraints和unique Constraints都需要保證列是唯一的,不能有重復值,但是一張表只能有一個Primary key Constraints,但是可以有多個unique Constraints。還有就是Primary key Constraints是非空的,但是unique Constraints允許為空。不過需要注意的是,因為在SQL Server中可以NULL==NULL,所以unique列只允許只有一個NULL值。具體參考UNIQUE Constraints。實例驗證如下

use TESTDB3
go
--1.創建表
create table t1
(
    stuid int unique,
    stuname nvarchar(10)
);
go

--2.插入兩條記錄,有一列是null
insert t1 values(1,'xuwei');
insert t1 values(null,'xuwei');
select * from t1;

--3.在unique約束的列中再次插入null值
insert t1 values(null,'xuwei');

Primary key 和index

When you specify a PRIMARY KEY constraint for a table, the Database Engine enforces data uniqueness by creating a unique index for the primary key columns. This index also permits fast access to data when the primary key is used in queries. Therefore, the primary keys that are chosen must follow the rules for creating unique indexes. --------PRIMARY KEY Constraints

創建primary key的時候肯定會創建一個unique index。創建unique index 是為了提高保證primary key唯一性的效率 。試想不創建unique index,那么就是堆結構。而主鍵是要保證唯一的,那么每次插入一條數據都要進行一次table scan,遍歷整張表。假如我們有了索引,每次只需要一次index seek就好了。效率大大提高。

unique index的主要實現方式

  1. 在創建 PRIMARY KEY 約束時,如果不存在該表的聚集索引且未指定唯一非聚集索引,則將自動對一列或多列創建唯一聚集索引。主鍵列不允許空值。
  2. 在創建 UNIQUE 約束時,默認情況下將創建唯一非聚集索引,以便強制 UNIQUE 約束。如果不存在該表的聚集索引,則可以指定唯一聚集索引。

索引的有序結構

所有索引都是有序的。正是因為有序,查詢才能夠更快。

非聚集索引的葉子節點保存的是非聚集索引鍵和bookmark,其中非聚集索引鍵是有序的。如下圖所示:

聚集索引的葉子節點就是數據本身,數據本身按照聚集索引鍵有序。如下圖所示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM