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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。