主鍵與聚集索引
主鍵(PRIMARY KEY )
來自MSDN的描述:
表通常具有包含唯一標識表中每一行的值的一列或一組列。這樣的一列或多列稱為表的主鍵 (PK),用于強制表的實體完整性。在創(chuàng)建或修改表時,您可以通過定義 PRIMARY KEY 約束來創(chuàng)建主鍵。
一個表只能有一個 PRIMARY KEY 約束,并且 PRIMARY KEY 約束中的列不能接受空值。由于 PRIMARY KEY 約束可保證數據的唯一性,因此經常對標識列定義這種約束。
如果為表指定了 PRIMARY KEY 約束,則 SQL Server 2005 數據庫引擎 將通過為主鍵列創(chuàng)建唯一索引來強制數據的唯一性。當在查詢中使用主鍵時,此索引還可用來對數據進行快速訪問。因此,所選的主鍵必須遵守創(chuàng)建唯一索引的規(guī)則。
創(chuàng)建主鍵時,數據庫引擎 會自動創(chuàng)建唯一的索引來強制實施 PRIMARY KEY 約束的唯一性要求。如果表中不存在聚集索引或未顯式指定非聚集索引,則將創(chuàng)建唯一的聚集索引以強制實施 PRIMARY KEY 約束。
聚集索引
聚集索引基于數據行的鍵值在表內排序和存儲這些數據行。每個表只能有一個聚集索引,因為數據行本身只能按一個順序存儲。
每個表幾乎都對列定義聚集索引來實現下列功能:
可用于經常使用的查詢。
提供高度唯一性。
兩者的比較
下面是一個簡單的比較表
| 主鍵 | 聚集索引 | |
| 用途 | 強制表的實體完整性 | 對數據行的排序,方便查詢用 |
| 一個表多少個 | 一個表最多一個主鍵 | 一個表最多一個聚集索引 |
| 是否允許多個字段來定義 | 一個主鍵可以多個字段來定義 | 一個索引可以多個字段來定義 |
| 是否允許 null 數據行出現 | 如果要創(chuàng)建的數據列中數據存在null,無法建立主鍵。 創(chuàng)建表時指定的 PRIMARY KEY 約束列隱式轉換為 NOT NULL。 |
沒有限制建立聚集索引的列一定必須 not null . 也就是可以列的數據是 null 參看最后一項比較 |
| 是否要求數據必須唯一 | 要求數據必須唯一 | 數據即可以唯一,也可以不唯一??茨愣x這個索引的 UNIQUE 設置。 (這一點需要看后面的一個比較,雖然你的數據列可能不唯一,但是系統(tǒng)會替你產生一個你看不到的唯一列) |
| 創(chuàng)建的邏輯 | 數據庫在創(chuàng)建主鍵同時,會自動建立一個唯一索引。 如果這個表之前沒有聚集索引,同時建立主鍵時候沒有強制指定使用非聚集索引,則建立主鍵時候,同時建立一個唯一的聚集索引 |
如果未使用 UNIQUE 屬性創(chuàng)建聚集索引,數據庫引擎 將向表自動添加一個四字節(jié) uniqueifier 列。 必要時,數據庫引擎 將向行自動添加一個 uniqueifier 值,使每個鍵唯一。此列和列值供內部使用,用戶不能查看或訪問。 |
相關文章
Ubuntu 17.10安裝phpMyAdmin數據庫管理工具配置詳解
這篇文章主要介紹了Ubuntu 17.10安裝phpMyAdmin數據庫管理工具,通過示例代碼給大家講解了安裝phpmyadmin數據庫的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-03-03
Navicat?Premium12進行數據庫定期自動備份的方法步驟
本文主要介紹了Navicat?Premium?12進行數據庫定期自動備份,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
Navicat Premium 15無限試用注冊表修改的方法詳解
這篇文章主要介紹了Navicat Premium 15無限試用注冊表修改的方法詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
使用Navicat工具比對兩個數據庫所有表結構的差異案例詳解
這篇文章主要介紹了如何使用Navicat工具對比兩個數據庫test_old和test_new,并生成相應的DDL?SQL語句,以便將test_old升級到和test_new一致的狀態(tài),需要的朋友可以參考下2025-02-02

