SQLServer學習筆記 - 主鍵的理解

Light_Laser發表於2020-10-08


最近在學習SQLServer時,發現裡面有個主鍵的概念和作用總是模糊不清,因此上網去搜尋了一些主鍵的一些意義,加深一下理解

什麼是主鍵

按照百度百科的定義,主鍵(primary key)是資料表中的一個或多個欄位,其值用於唯一的標識表中的某一條記錄;在兩個表的關係中,主關鍵字用來在一個表中引用來自於另一個表的特定記錄;
(這段話有點抽象,看完了和沒看區別不大,且看下面的講解)

建立主鍵遵循的原則

(1)主鍵應當是對使用者沒有意義的,當使用者看到了一個表示多對多關係的連線表中的資料,並抱怨它沒有什麼用處,那麼證明表的主鍵設計很好;
(2)永遠不要更新主鍵,因此主鍵除了唯一的標識一行之外,沒有其他用處,如果需要更新,那麼主鍵對於使用者無意義的原則被違反了
:這項原則在對於哪些經常需要在資料轉換或者多資料合併時進行資料整理的資料並不適用
(3)主鍵不應該包含動態變化的資料,如時間戳、時間列等
(4)主鍵應當由計算機自動生成

主鍵的特點

(1)一個表中只能有一個主鍵,如果在其他欄位上建立主鍵,則原來的主鍵就會取消
(2)主鍵的值不可以重複,也不可以為空

真正的主鍵理解

說了前面這麼多概念,現在以一個實際例子來說明主鍵
假設想建立一個學生資訊表,包含資訊如下:

create table StudentInfo
(
	StudentId int prinamry key identity, -- 主鍵
	StudentName varchar(20)  not null, -- 唯一鍵
	StudentGender char(2) not null,
	StudentAddress varchar(500) not null,
	StudentAccount varchar(100) unique
)

要求學生在使用學生登入系統時採用賬戶進行登入;
那麼如何去選擇主鍵呢?
可能從名字上來說,主鍵會被認為是十分重要的鍵,因此可能會說採用賬戶來做主鍵,這樣顯得有足夠的重要性;但是其實不然,從主鍵的選擇原則來看,主鍵就是需要選擇沒有太多意義且不會被改變的資料,而對於大部分來說,賬戶其實是可以進行更改的,那麼用賬戶來做主鍵就很不方便了
那麼什麼資料可以很好的標識一個學生,並且學生不能夠自由更改呢?並且該資料還可以和其他資料進行很好的關聯呢?
其實答案很明顯,那就是StudentId
StudentId對於實際來說基本是沒有意義的,因為其不可更改,並且僅僅是學生的一個編號,用來標識學生在學校裡的身份,因此用其作為主鍵可以標識學生的唯一性;除此之外,利用StudentId還可以很好的與其他資料表連線,如班級資訊,成績資訊,獲獎資訊等等;

唯一鍵

不知道你們有沒有注意到,在上述程式碼中,我將StudentAccount加了一個Unique約束,這表示唯一鍵約束,主要是用來防止資料重複,這樣的話就可以令學生註冊的賬戶都不一樣

總結

總的來說,主鍵就是一個對資料沒有較大意義,但是具有無重複性,可以唯一標識表中的每一條記錄,最簡單的例子就是我們們的身份證,標識了你這個人,選擇主鍵也儘量往這個原則上去選,並且,在SQL中,每張表都最好需要加上一個主鍵,這樣可以很好的建立資料關聯

相關文章