主索引和主鍵的正式定義是什麼?
以下來自數據庫系統基礎(第 7 版)
17.1 單級有序索引的類型
有幾種類型的有序索引。主索引是在記錄的****有序文件的排序鍵欄位上指定的。回想一下第 16.7 節,排序鍵欄位用於對磁碟上的文件記錄進行物理排序,並且每個記錄對該欄位都有唯一的值。如果排序欄位不是關鍵欄位——也就是說,如果文件中的許多記錄可以具有相同的排序欄位值——則可以使用另一種類型的索引,稱為聚群索引。數據文件稱為集群文件在後一種情況下。請注意,一個文件最多可以有一個物理排序欄位,因此它最多可以有一個主索引或一個聚群索引,但不能同時具有這兩者。第三種索引,稱為二級索引,可以在文件的任何非排序欄位上指定。一個數據文件除了其主要訪問方法外,還可以有多個二級索引。我們將在接下來的三個小節中討論這些類型的單級索引。
17.1.1 主索引
主索引是一個有序的文件,它的記錄長度固定,有兩個欄位,它就像一個訪問結構,可以有效地搜尋和訪問數據文件中的數據記錄。第一個欄位與數據文件的排序鍵欄位(稱為主鍵)具有相同的數據類型,第二個欄位是指向磁碟塊的指針(塊地址)。對於數據文件中的每個塊,索引文件中都有一個索引條目(或索引記錄)。每個索引條目都有一個塊中第一條記錄的主鍵欄位的值和一個指向該塊的指針作為它的兩個欄位值。
具體來說,我的問題是關於*“主要索引”*,因為它與更正式的學術用語有關——我從未上過大學,所以我不知道他們是如何使用這個術語的。“ 在有序記錄文件的排序鍵欄位上指定主索引”是否正確?
PRIMARY
那是鍵(用於主索引)和正常鍵進入非主非聚集索引之間的原始區別嗎?我認為這本書並沒有以 151.00 美元的價格發行 7 版,並沒有錯誤地認為主鍵需要“有序的記錄文件”。
“鍵”是用於標識特定記錄的邏輯結構。鑑於它們的用途,密鑰需要唯一性。主鍵欄位也需要聲明為. 還有“備用”鍵允許將鍵欄位聲明為. 主鍵和備用鍵都有一個可選的次要目的,即通過外鍵建立關係(聲明性引用完整性)。
NOT NULL``NULL
“索引”是用於訪問一個或多個記錄的物理構造。為此目的不需要唯一性。當索引聲明為唯一時,不需要將索引列聲明為
NOT NULL
;NULL
允許,只要它是唯一的,或者在使用多個索引列時是唯一的組合。鑑於引用的兩個段落,這裡是一個術語翻譯表:
- 書籍→ SQL Server
- “文件”→表或索引
- “主索引” → 唯一聚集索引
- “集群索引”→非唯一集群索引(由於集群鍵列是行
INT
標識符,因此需要真正的唯一性,因此 SQL Server 將通過添加隱藏的自動遞增值來保證唯一性稱為唯一符,但僅適用於實際的非唯一鍵值:請參閱聚群索引唯一符存在和大小了解詳情)- “二級索引”→非集群索引
- “主鍵”→在唯一聚集索引上定義的主鍵
在 SQL Server 中,不需要在 UNIQUE CLUSTERED 索引上定義主鍵,它只需要一個唯一索引(儘管在不存在聚集索引時創建 PK 時的預設行為是使 PK 聚集)。
此外,外鍵可以引用主鍵或“備用”鍵(即唯一約束或唯一索引)
以下範例顯示了非集群索引上的 PK 和引用在允許 NULL 值的列上定義的備用鍵的 FK:
USE [tempdb]; -- DROP TABLE dbo.Parent CREATE TABLE dbo.Parent ( [ParentID] INT NOT NULL CONSTRAINT [PK_Parent] PRIMARY KEY NONCLUSTERED, [AltKey] INT NULL CONSTRAINT [UQ_Parent_AltKey] UNIQUE NONCLUSTERED ); -- DROP TABLE dbo.ChildID CREATE TABLE dbo.ChildID ( [ChildID] INT NOT NULL CONSTRAINT [PK_Child] PRIMARY KEY NONCLUSTERED, [AltKey] INT NULL CONSTRAINT [FK_Child_Parent_AltKey] FOREIGN KEY REFERENCES dbo.Parent ([AltKey]) );
索引根本不是關係數學的一部分。它們是 RDBMS 實現的一部分,僅用於加速數據處理。相反的鍵是 r/math 約束,它們應用於應該符合一些限制(如唯一性或存在性)的集合。實際上,主鍵是表範圍內始終存在的唯一標識符,有時是隱式的和自動的。可以在主鍵上建構主索引,但這不是必需的。而且,表可以同時擁有多個適合作為主鍵的鍵。並且替代方案可以成為
primary key
臨時的。