1. 程式人生 > >超鍵、候選鍵、主鍵、外來鍵、聯合主鍵、複合主鍵

超鍵、候選鍵、主鍵、外來鍵、聯合主鍵、複合主鍵

首先看看各種鍵的定義:

超鍵(super key):在關係中能唯一標識元組的屬性集稱為關係模式的超鍵(只要有一個鍵唯一,再隨便組其他的鍵,合起來叫主鍵)

候選鍵(candidatekey):不含有多餘屬性的超鍵稱為候選鍵(最小的超鍵,ID,身份證號)

主鍵(primary key):關係型資料庫中的一條記錄中有若干個屬性,若其中某一個屬性(注意是)能唯一標識一條記錄,該屬性組就可以成為一個主鍵 (在超鍵選取一個作為主鍵,如果有多個欄位的叫為聯合主鍵)

外來鍵(foreign key)如果關係模式R1中的某屬性集不是R1的主鍵,而是另一個關係R2的主鍵則該屬性集是關係模式R1的外來鍵。

結合例項的具體解釋:

假設有如下兩個表:

學生(學號,姓名,性別,身份證號,教師編號)

教師(教師編號,姓名,工資)

超鍵:

由超鍵的定義可知,學生表中含有學號或者身份證號的任意組合都為此表的超鍵。如:(學號)、(學號,姓名)、(身份證號,性別)等。

候選鍵:

候選鍵屬於超鍵,它是最小的超鍵,就是說如果再去掉候選鍵中的任何一個屬性它就不再是超鍵了。學生表中的候選鍵為:(學號)、(身份證號)。

主鍵:

主鍵就是候選鍵裡面的一個,是人為規定的,例如學生表中,我們通常會讓“學號”做主鍵,教師表中讓“教師編號”做主鍵。

外來鍵:

外來鍵比較簡單,學生表中的外來鍵就是“教師編號”。外來鍵主要是用來描述兩個表的關係。


超鍵(super key):在關係中能唯一標識元組的屬性集稱為關係模式的超鍵

候選鍵(candidate key):不含有多餘屬性的超鍵稱為候選鍵

主鍵(primary key):使用者選作元組標識的一個候選鍵程式主鍵

比如一個小範圍的所有人,沒有重名的,考慮以下屬性

身份證 姓名 性別 年齡

身份證唯一,所以是一個超鍵

姓名唯一,所以是一個超鍵

(姓名,性別)唯一,所以是一個超鍵

(姓名,性別,年齡)唯一,所以是一個超鍵

--這裡可以看出,超鍵的組合是唯一的,但可能不是最小唯一的

身份證唯一,而且沒有多餘屬性,所以是一個候選鍵

姓名唯一,而且沒有多餘屬性,所以是一個候選鍵

--這裡可以看出,候選鍵是沒有多餘屬性的超鍵

考慮輸入查詢方便性,可以選擇 身份證 為主鍵

也可以 考慮習慣 選擇 姓名 為主鍵

--主鍵是選中的一個候選鍵

一題搞懂什麼是候選鍵 

看下題目先 

在SQL Server資料庫中,有一個學生資訊表如下所示,在該表中不能作為候選鍵的屬性集合為( ) (選擇一項) 

學號 姓名 性別 年齡 系別 專業 

20020612 李輝 男 20 計算機 軟體開發 

20060613 張明 男 18 計算機 軟體開發 

20060614 王小玉 女 19 物理 力學 

20060615 李淑華 女 17 生物 動物學 

20060616 趙靜 男 21 化學 食品化學 

20060617 趙靜 女 20 生物 植物學 

a){學號} 

b){學號、姓名} 

c){年齡、系別} 

d){姓名、性別} 

e){姓名、專業} 

可能大家不知道如何來選擇。如果這個題目我們可以正確的解答,那麼對於超鍵以及候選鍵和主鍵的概念已經有很深刻的認識了。 

看下概念: 

超鍵:在關係中能惟一標識元組的屬性集稱為關係模式的超鍵。 

候選鍵:不含有多餘屬性的超鍵稱為候選鍵。也就是在候選鍵中,若要再刪除屬性就不是鍵了。 

主鍵:使用者選作元組標識的一個候選鍵稱為主鍵。 

透過概念,我們可以瞭解到,超鍵包含著候選鍵,候選鍵中包含著主鍵。主鍵一定是惟一的。為什麼呢?因為他的爺爺超鍵就是惟一的。 

我們分析一下上面的題目,abcde5個答案都可以作為超鍵,他們組合在一起的集合可以用來惟一的標識一條資料記錄(實體)。 

請注意我們的要求:候選鍵。候選鍵要求是不能包含多餘屬性的超鍵,我們看一下答案b。在答案b中,如果我們不使用姓名也可以惟一的 

標識一條資料實體,可以說姓名欄位在這裡是多餘的。那麼很明顯,b選項包含了多餘欄位屬性。那麼這題答案應該選擇b

那麼其他的4個選項都可以作為候選鍵,假設很幸運,a)學號 被選擇作為使用者正在使用的候選鍵來惟一標識元組了,那麼他很幸運的獲得了主鍵的稱號。

 


聯合主鍵 複合主鍵

 

其實“主鍵是唯一的索引”這話有點歧義的。舉個例子,我們在表中建立了一個ID欄位,自動增長,並設為主鍵,這個是沒有問題的,因為“主鍵是唯一的索引”,ID自動增長保證了唯一性,所以可以。

此時,我們再建立一個欄位name,型別為varchar,也設定為主鍵,你會發現,在表的多行中你是可以填寫相同的name值的,這豈不是有違“主鍵是唯一的索引”這句話麼?

所以我才說“主鍵是唯一的索引”是有歧義的。(複合主鍵)應該是“當表中只有一個主鍵時,它是唯一的索引;當表中有多個主鍵時,稱為複合主鍵,複合主鍵聯合保證唯一索引”。

為什麼自增長ID已經可以作為唯一標識的主鍵,為啥還需要複合主鍵呢。因為,並不是所有的表都要有ID這個欄位啊哈哈,比如,我們建一個學生表,沒有唯一能標識學生的ID,怎麼辦呢,學生的名字、年齡、班級都可能重複,無法使用單個欄位來唯一標識,這時,我們可以將多個欄位設定為主鍵,形成複合主鍵,這多個欄位聯合標識唯一性,其中,某幾個主鍵欄位值出現重複是沒有問題的,只要不是有多條記錄的所有主鍵值完全一樣,就不算重複。

 

什麼是資料表的複合主鍵

所謂的複合主鍵 就是指你表的主鍵含有一個以上的欄位組成
比如
create table test
(
   name varchar(19),
   id number,
   value varchar(10),
   primary key (name,id)
)

上面的name和id欄位組合起來就是你test表的複合主鍵

它的出現是因為你的name欄位可能會出現重名,所以要加上ID欄位這樣就可以保證你記錄的唯一性
一般情況下,主鍵的欄位長度和欄位數目要越少越好

聯合主鍵
什麼是聯合主鍵?
(主鍵原則上是唯一的,別被唯一值所困擾。)
顧名思義就是多個主鍵聯合形成一個主鍵組合
一個簡單的例子
主鍵A跟主鍵B組成聯合主鍵
主鍵A跟主鍵B的資料可以完全相同(困擾吧,沒關係),聯合就在於主鍵A跟主鍵B形成的聯合主鍵是唯一的。
下例主鍵A資料是1,主鍵B資料也是1,聯合主鍵其實是11,這個11是唯一值,絕對不充許再出現11這個唯一值。(這就是多對多關係)
主鍵A資料主鍵B資料
1      1
2      2
3      3
主鍵A與主鍵B的聯合主鍵值最多也就是
11
12
13
21
22
23
31
32
33