| |關聯式資料庫|Index|資料正規化|SQL (1)|SQL (2)|SQL (3)|SQL (4)|SQL (5)| | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 資料庫簡介 |
| ||||||||||||||||||||||||||||||
|
Key | |||||||||||||||||||||||||||||||
候選鍵(Candidate Key) | |||||||||||||||||||||||||||||||
| 什麼是「候選鍵」?簡單地說,它就是具有資格成為 primary key 的「候選人」。「候選鍵」可以由一至多個欄位組成,但它必須同時符合以下兩項條件才行。 | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
| 1. 「唯一性」(uniqueness): | |||||||||||||||||||||||||||||||
| 在被選定為「候選鍵」的欄位中,沒有任何兩組相同的記錄。以上表為例,「身分證字號」可以做為候選鍵,「班級+座號」也可以;但單單只有「班級」或只有「座號」都不行,因為「班級」這欄的有相同的記錄,「座號」這欄也是。 | |||||||||||||||||||||||||||||||
| 2. 「最簡性」(irreducibility): | |||||||||||||||||||||||||||||||
| 由多欄位組成的「候選鍵」,其中的任何欄位組合都不能具有唯一性。同樣以上表為例,「身分證字號+姓名」不可以做為候選鍵,因為「身分證字號」本身即具有唯一性了。 | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
| 具有 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)| | |||||||||||||||||||||||||||||||


候選鍵(Candidate Key)
題外話: