MySQL 中的外鍵是指一個表中的一列(或一組列),該列引用另一個表中的主鍵。包含外鍵的表稱為子表,而包含所引用的主鍵的表稱為父表.
父子表
讓我們用一個簡單的例子來說明父表和子表的概念。請考慮以下兩個表格,其中包含有關學生及其各自老師的一些信息:
pupil 表:
|
ID |
名字 |
|---|---|
|
1 |
axel |
|
2 |
bobby |
|
3 |
cathy |
請參閱此處生成 pupil 表的代碼。
teacher 表:
|
teacher_id |
teacher_name |
pupil_id |
部門 |
|---|---|---|---|
|
1 |
emily |
1 |
physics |
|
2 |
fiona |
2 |
physics |
|
3 |
gilbert |
3 |
chemistry |
請參閱此處生成 teacher 表的代碼。
-
檢查每個表的代碼,您將看到
teacher表的pupil_id字段引用pupil表的id字段。 -
因此在這個例子中
pupil表是家長表和teacher表是孩子表格。
外鍵的重要性
每當一個表引用另一個表時,使用外鍵幾乎總是一個好主意。讓我們用一個簡單的例子來理解為什麽。
讓我們再次使用相同的表:
pupil(父表)
|
ID |
名字 |
|---|---|
|
1 |
axel |
|
2 |
bobby |
|
3 |
cathy |
teacher(子表)
|
teacher_id |
teacher_name |
pupil_id |
部門 |
|---|---|---|---|
|
1 |
emily |
1 |
physics |
|
2 |
fiona |
2 |
physics |
|
3 |
gilbert |
3 |
chemistry |
假設我們添加一位新老師來監督一名新學生pupil_id=4:
teacher(子表)
|
teacher_id |
teacher_name |
pupil_id |
部門 |
|---|---|---|---|
|
1 |
emily |
1 |
physics |
|
2 |
fiona |
2 |
physics |
|
3 |
gilbert |
3 |
chemistry |
|
4 |
helen |
4 |
physics |
您能看到我們目前的數據不一致嗎?我們有一位老師所監管的學生不存在於我們的 pupil 表中(即 pupil 表中沒有 id=4 的學生)。
注意
外鍵是防止我們的數據出現這些不一致的約束。換句話說,有了外鍵,我們將無法添加Helen記錄,因為MySQL知道pupil_id=4在pupil的id字段中沒有相應的匹配項。表格。
為了證明這一點,讓我們嘗試將老師 Helen 插入到我們的 teacher 表中,他將用 pupil_id = 4 來監督新學生:
INSERT INTO teacher(teacher_name, pupil_id)
VALUES ('helen', 4);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails.
太好了,外鍵對於防止數據庫中的不一致很有用!
從父表中刪除
可能發生不一致的另一種情況是刪除父表中的記錄。例如,假設我們嘗試從 pupil 表中刪除 id=2 的學生:
DELETE FROM pupil
WHERE id = 2;
這將導致錯誤,因為子表包含帶有 pupil_id=2 的記錄,如果刪除 bobby (即 id=2 ),則父表中將不再有匹配的記錄。
瞳孔(父表)
|
ID |
名字 |
|---|---|
|
1 |
axel |
|
2 |
bobby |
|
3 |
cathy |
老師 (子表)
|
teacher_id |
teacher_name |
pupil_id |
部門 |
|---|---|---|---|
|
1 |
emily |
1 |
physics |
|
2 |
fiona |
2 |
physics |
|
3 |
gilbert |
3 |
chemistry |
此外,當我們也更新父表時,可能會出現同樣的不一致:
UPDATE pupil
SET id = 3
WHERE id = 2;
當我們使用外鍵時,所有這些不一致的情況都可以避免。因此,建議使用它!
默認情況下,外鍵沒有任何限製,它可以采用 NULL 以及重複值。
相關用法
- MySQL FROM_BASE64()用法及代碼示例
- MySQL FROM_UNIXTIME方法用法及代碼示例
- MySQL FIELD方法用法及代碼示例
- MySQL FROM_BASE64方法用法及代碼示例
- MySQL FROM_UNIXTIME()用法及代碼示例
- MySQL FORMAT()用法及代碼示例
- MySQL FORMAT方法用法及代碼示例
- MySQL FROM_DAYS()用法及代碼示例
- MySQL FLOOR()用法及代碼示例
- MySQL FROM_DAYS方法用法及代碼示例
- MySQL FIND_IN_SET()用法及代碼示例
- MySQL FLOOR方法用法及代碼示例
- MySQL FIELD()用法及代碼示例
- MySQL FIND_IN_SET方法用法及代碼示例
- MySQL FLOAT and DOUBLE用法及代碼示例
- MySQL FLOOR() AND CEIL()用法及代碼示例
- MySQL From_days()用法及代碼示例
- MySQL ROUND()用法及代碼示例
- MySQL REPEAT()用法及代碼示例
- MySQL POWER()用法及代碼示例
- MySQL LEAD() and LAG()用法及代碼示例
- MySQL IS_IPV4()用法及代碼示例
- MySQL RADIANS方法用法及代碼示例
- MySQL VARIANCE方法用法及代碼示例
- MySQL WEEK()用法及代碼示例
注:本文由純淨天空篩選整理自Arthur Yanagisawa大神的英文原創作品 MySQL | Foreign keys。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
