MySQL中的外來鍵是什麼 有什麼作用

2021-09-24 21:55:53 字數 2579 閱讀 3350

最近自學資料庫mysql,然後有個疑問,一直不得其解,查詢了相關資料,最後還是沒有解決。

我的疑問是 "使用外來鍵約束" ,然後我對 "外來鍵" 這個詞不是很理解,查詢相關資料都是講一些術語,說外來鍵的主要作用是:保持資料的一致性、完整性。聽得我是一頭霧水。

關於外來鍵,我有自己的一些理解,但是不曉得是否正確,舉個例子來表達我的看法:假如現在需要建立乙個表,乙個什麼樣的表呢?乙個班級的學生個人資訊表:

所以在設計的時候,就給表1新增乙個外來鍵,這個外來鍵就是表2中的學號字段,那麼這樣表1就是主表,表2就是子表。所以結合2張表就能保持資料的一致性、完整性(估計就是還原成原來的那張大表吧)。

藉著這個例子再談談外來鍵的一些事項:

1、表1可以有乙個或者多個外來鍵,也可以沒有。(如果表1有多個外來鍵可不可以是這樣的情況,表2中的多個欄位是表1的外來鍵;或者說表1的多個外來鍵是在多個表中)

2、這個外來鍵可以不是表1的主鍵,但必須是子表的主鍵。(簡單的說就是,如果乙個欄位是某個表的外來鍵時,那麼該欄位必須是主鍵)

以上就是我個人對外鍵的理解。

-------------------------------------解--------答-------------------------------------

+-------+   ref   +-------+

|  sub  | ------> |  main |

+-------+         +-------+

從表(sub)的某列引用(ref)主表(main)的某列的值。比如學生表有個學生編號(sid),分數表中的學生列(stu)引用學生表的學 生編號,此時對於分數表的 stu 來說,學生表的 sid 就是外來鍵。從表也叫外來鍵表,主表也叫主鍵表、外表,列也叫字段。

所以在設計的時候,就給表1新增乙個外來鍵,這個外來鍵就是表2中的學號字段,那麼這樣表1就是主表,表2就是子表

你的主從關係理解顛倒了。你的圖中,表1的確是主表,表2是子表,但不是叫做給表1新增乙個外來鍵,而是給表2新增乙個外來鍵,表2中的學號 欄位就叫外來鍵,它是表1學號字段的主鍵。你可以這樣說:表1的學號字段是表2的外來鍵。

你貼的已經解釋了。為了一張表記錄的資料不要太過冗餘。這和軟體工程的模組化思想差不多類似,只不過在資料庫中是對錶關係進行解耦,盡量讓表 記錄的資料單一化。就如你貼的中,把成績和學生資訊放在一張表中就太冗餘了,成績完全可以以學生的id作為區分標識。

你想想,你的圖中的第一章表分割成了表1和表2,表2的學號引用了表1的學號字段作為外來鍵,如果不建立外來鍵,只是和表1一樣單純性 地設立乙個學號字段,那麼和建立外來鍵有什麼區別呢?

比如表1中張三的學號為20140900001,那麼我在表2中插資料的時候在學號字段插20140900001來記錄張三的成績不也是做到了表 的解耦了嗎?

這裡存在的問題是,在不設定外來鍵的情況下,表2的學號字段和表1的學號字段是沒有關聯的。只是你自己認為他們有關係而已,資料庫並 不認為它倆有關係。也就是說,你在表2的學號字段插了乙個值(比如20140999999),但是這個值在表1中並沒有,這個時候,資料庫還是允 許你插入的,它並不會對插入的資料做關係檢查。然而在設定外來鍵的情況下,你插入表2學號字段的值必須要求在表1的學號字段能找到。 同時,如果你要刪除表1的某個學號字段,必須保證表2中沒有引用該字段值的列,否則就沒法刪除。這就是所謂的保持資料的一致性和完整性。你想,如 果表2還引用表1的某個學號,你卻把表1中的這個學號刪了,表2就不知道這個學號對應的學生是哪個學生。資料的一致性還包括資料型別的一致性(這 個見下面就知道了)。

從表的字段必須與外來鍵型別相同(如上,分數表 stu 的型別必須和學生表 sid 的型別相同,比如都是 int(10) 型別)

外來鍵必須是主表的唯一鍵(如上,學生表 sid 是主鍵,而主鍵是唯一的,所以可以作為分數表 stu 的外來鍵)

有關聯的字段(如上,分數表之所以使用學生表的 sid 是因為兩者有關聯,分數表記錄的是學生的分數,而學生可以用 sid 來唯 一標識)

避免使用復合鍵(也就是說從表可以同時引用多個外表的字段作為乙個外來鍵,一般不推薦這種做法)

如果表1有多個外來鍵可不可以是這樣的情況,表2中的多個欄位是表1的外來鍵;或者說表1的多個外來鍵是在多個表中。 都可以。因為表1的外來鍵不一定是表2的主鍵,也可以是唯一鍵(unique)。比如表2有個主鍵 a,有個唯一鍵 b,表1兩個字段 a' 和 b』 分別引用表2的 a 和 b,這就是多對多的關係了。再或者表2主鍵 a,表3主鍵 b,表1的兩個字段 a' 和 b' 分別引用表2的 a 和表3 的 b。

這個外來鍵可以不是表1的主鍵,但必須是子表的主鍵。(簡單的說就是,如果乙個欄位是某個表的外來鍵時,那麼該欄位必須是主鍵)

因為你前面就理解錯了,所以這句話本身就是錯的。對於從表來說,外來鍵不一定需要作為從表的主鍵,外來鍵也不一定是外表的主鍵,外表的唯一鍵就可以作 為從表的外來鍵。

表1的學號字段是表2的外來鍵

1.學號 姓名 性別 民族 身份證

2.學號 姓名 年齡 語文  數學

MySQL中的外來鍵是什麼 有什麼作用

近期自學資料庫mysql。然後有個疑問。一直不得其解。查詢了相關資料。最後還是沒有解決。我的疑問是 使用外來鍵約束 然後我對 外來鍵 這個詞不是非常理解。查詢相關資料都是講一些術語。說外來鍵的主要作用是 保持資料的一致性 完整性。聽得我是一頭霧水。關於外來鍵。我有自己的一些理解,可是不曉得是否正確,...

MySQL中的外來鍵是什麼 有什麼作用

最近自學資料庫mysql,然後有個疑問,一直不得其解,查詢了相關資料,最後還是沒有解決。我的疑問是 使用外來鍵約束 然後我對 外來鍵 這個詞不是很理解,查詢相關資料都是講一些術語,說外來鍵的主要作用是 保持資料的一致性 完整性。聽得我是一頭霧水。關於外來鍵,我有自己的一些理解,但是不曉得是否正確,舉...

MySQL中的外來鍵是什麼 有什麼作用

關於外來鍵,我有自己的一些理解,但是不曉得是否正確,舉個例子來表達我的看法 假如現在需要建立乙個表,乙個什麼樣的表呢?乙個班級的學生個人資訊表 所以在設計的時候,就給表1新增乙個外來鍵,這個外來鍵就是表2中的學號字段,那麼這樣表1就是主表,表2就是子表。所以結合2張表就能保持資料的一致性 完整性 估...