超鍵、候選鍵、主鍵、外來鍵、聯合主鍵、複合主鍵
首先看看各種鍵的定義:
超鍵(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