1. 程式人生 > >數據庫外鍵理解

數據庫外鍵理解

否則 htm -- html sql 相關 解耦 什麽是 成了

近期自學數據庫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的外鍵。

外鍵用來幹什麽

你貼的圖片已經解釋了。

為了一張表記錄的數據不要太過冗余。這和軟件project的模塊化思想差點兒相同類似,僅僅只是在數據庫中是對表關系進行解耦,盡量讓表 記錄的數據單一化。就如你貼的圖片中,把成績和學生信息放在一張表中就太冗余了,成績全然能夠以學生的id作為區分標識。

為什麽說外鍵能保持數據的一致性、完整性

你想想,你的圖中的第一章表切割成了表1和表2,表2的學號引用了表1的學號字段作為外鍵,假設不建立外鍵。僅僅是和表1一樣單純性 地設立一個學號字段。那麽和建立外鍵有什麽差別呢?

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

這裏存在的問題是。在不設置外鍵的情況下。表2的學號字段和表1的學號字段是沒有關聯的。僅僅是你自己覺得他們有關系而已。數據庫並 不覺得它倆有關系。也就是說,你在表2的學號字段插了一個值(比方20140999999),可是這個值在表1中並沒有,這個時候,數據庫還是允 許你插入的,它並不會對插入的數據做關系檢查。然而在設置外鍵的情況下。你插入表2學號字段的值必需要求在表1的學號字段能找到。 同一時候。假設你要刪除表1的某個學號字段。必須保證表2中沒有引用該字段值的列,否則就沒法刪除。

這就是所謂的保持數據的一致性和完整性。你想。如 果表2還引用表1的某個學號,你卻把表1中的這個學號刪了,表2就不知道這個學號相應的學生是哪個學生。

數據的一致性還包含數據類型的一致性(這 個見以下就知道了)。

外鍵的使用規範

  1. 從表的字段必須與外鍵類型同樣(如上。分數表 stu 的類型必須和學生表 sid 的類型同樣,比方都是 int(10) 類型)
  2. 外鍵必須是主表的唯一鍵(如上。學生表 sid 是主鍵,而主鍵是唯一的。所以能夠作為分數表 stu 的外鍵)
  3. 有關聯的字段(如上,分數表之所以使用學生表的 sid 是由於兩者有關聯,分數表記錄的是學生的分數,而學生能夠用 sid 來唯 一標識)
  4. 避免使用復合鍵(也就是說從表能夠同一時候引用多個外表的字段作為一個外鍵,一般不推薦這樣的做法)

你的問題

  1. 假設表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。

  2. 這個外鍵能夠不是表1的主鍵,但必須是子表的主鍵。(簡單的說就是。假設一個字段是某個表的外鍵時,那麽該字段必須是主鍵)

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

再給一張圖以幫助理解

技術分享圖片

轉載自:https://www.cnblogs.com/bhlsheji/p/5332910.html

數據庫外鍵理解