關聯式資料庫Index資料正規化SQL (1)SQL (2)SQL (3)SQL (4)SQL (5)
資料庫簡介

Key

候選鍵(Candidate Key)
 什麼是「候選鍵」?簡單地說,它就是具有資格成為 primary key 的「候選人」。「候選鍵」可以由一至多個欄位組成,但它必須同時符合以下兩項條件才行。
身分證字號 班級 座號 姓名 成績
T120123456 3-1 1 陳小華 89
E120654321 3-1 2 張小文 90
T120989898 3-1 3 林小明 78
... ... ... ... ...
S220567890 3-2 1 葉小花 95
1. 「唯一性」(uniqueness):
 在被選定為「候選鍵」的欄位中,沒有任何兩組相同的記錄。以上表為例,「身分證字號」可以做為候選鍵,「班級+座號」也可以;但單單只有「班級」或只有「座號」都不行,因為「班級」這欄的有相同的記錄,「座號」這欄也是。
2. 「最簡性」(irreducibility):
 由多欄位組成的「候選鍵」,其中的任何欄位組合都不能具有唯一性。同樣以上表為例,「身分證字號+姓名」不可以做為候選鍵,因為「身分證字號」本身即具有唯一性了。
A B C
... ... ...
... ... ...
 具有 n 個欄位的表格,最多可能擁有 2n-1 個「候選鍵」。以上表為例,「A」、「B」、「C」、「A+B」、「A+C」、「B+C」與「A+B+C」都可能成為「候選鍵」。

主鍵(Primary Key)與候補鍵(Alternate Key)
 您可以在一個表格中挑選一組「候選鍵」做為「主鍵」,其他沒被選上的「候選鍵」,則被稱為「候補鍵」。
 有了「候選鍵」之後,我們可以用來區別每筆記錄,不致弄錯欲異動的對象。因此,雖說每個表格不見得一定要有「主鍵」,但一定至少要有一組「候選鍵」。

外鍵(Foreign Key)
 上圖之中有三個表格,分別是「供應商」(S)、「產品」(P)與「銷售統計」(SP)。其中,SP 的 S# 與 P# 是「外鍵」,它們分別對應到 S 的 S# 與 P 的 P#。
 S 的 S# 與 P 的 P# 都必須是「候選鍵」,在 SP 與它們對應時,才不會發生錯誤。
 當 SP 表的 S# 值為 S1 時,在 S 表的 S# 之中,一定要有 S1 這個值。若將 S 表的 S1 值給刪除了,則 SP 表中 S# 為 S1 的所有資料列需要一併刪除。也就是說,資料庫中不能含有任何未相配的外鍵值,這樣才能維持參考完整性(referential integrity)。
 在異動「外鍵」所對應的內容時,必須連帶異動「外鍵」本身的值,或是做一些必要的限制。例如,欲異動 S 之 S# 的某筆資料時,需連帶異動 SP 之 S# 中相關的資料;或者是限制只能異動還沒被 SP 對應到的其它 S#(如 S4)。
 在這樣的條件下,勢必將加重資料庫系統運作上的負擔。為了維持高的運作效率,MySQL 至 3.x 版為止,仍未真正地提供「外鍵」的功能。
 
題外話:

 當我們從表格中挑選一組「候選鍵」做為「主鍵」時,MySQL 會自動為它建立 index。

 此外,MySQL 也允許我們同時將多個「候選鍵」設為「主鍵」。例如我們分別將表格中的「A」、「B」與「C」三個欄位設為「主鍵」,這樣一來,MySQL 會分別為「A」、「A+B」與「A+B+C」建立 index,但不會對「B」、「C」、「A+C」或「B+C」這麼做。

 在這樣的情況下,多個「主鍵」之間的先後順序就需要注意了。


關聯式資料庫Index資料正規化SQL (1)SQL (2)SQL (3)SQL (4)SQL (5)