超键、候选键、主键、外键、联合主键、复合主键
首先看看各種鍵的定義:
超鍵(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
總結
以上是生活随笔為你收集整理的超键、候选键、主键、外键、联合主键、复合主键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java:面试
- 下一篇: Statement和PraparedSt