mysql中的外鍵是什嗎?以及需要使用外鍵嗎?

來源:互聯網
上載者:User

標籤:

外鍵的作用

外鍵的主要作用是:保持資料的一致性、完整性。

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

所以在設計的時候,就給表1添加一個外鍵,這個外鍵就是表2中的學號欄位,那麼這樣表1就是主表,表2就是子表。所以結合2張表就能保持資料的一致性、完整性(估計就是還原成原來的那張大表吧)。
藉著這個例子再談談外鍵的一些事項:
1表1可以有一個或者多個外鍵,也可以沒有。(如果表1有多個外鍵可不可以是這樣的情況,表2中的多個欄位是表1的外鍵;或者說表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。

外鍵不一定需要作為從表的主鍵,外鍵也不一定是外表的主鍵,外表的唯一鍵就可以作 為從表的外鍵

再給一張圖以協助理解

平常需要使用外鍵嗎? 

資料庫的諸多設計,帳號,許可權,約束,觸發器,都是為 C/S 結構設計的,是以 C 端不可信做為假設前提的。B/S 模式安全邊界前移到 web 服務層,應用與資料庫之間是可信的,應用自行完成這些功能更加靈活。所以能不用就不用

1. 互連網行業應用不推薦使用外鍵: 使用者量大,並發度高,為此資料庫伺服器很容易成為效能瓶頸,尤其受IO能力限制,且不能輕易地水平擴充;若是把資料一致性的控制放到事務中,也即讓應用伺服器承擔此部分的壓力,而引用伺服器一般都是可以做到輕鬆地水平的伸縮;

2.資料庫伺服器的效能不是問題,所以不用過多考慮效能的問題;另外,使用外鍵可以降低開發成本,藉助資料庫產品自身的觸發器可以實現表與關聯表之間的資料一致性和更新;最後一點,使用外鍵的方式,還可以做到開發人員和資料庫設計人員的分工,可以為程式員承擔更多的工作量;為何說外鍵有效能問題:
1.資料庫需要維護外鍵的內部管理;
2.外鍵等於把資料的一致性事務實現,全部交給資料庫伺服器完成;
3.有了外鍵,當做一些涉及外鍵欄位的增,刪,更新操作之後,需要觸發相關操作去檢查,而不得不消耗資源;
4.外鍵還會因為需要請求對其他表內部加鎖而容易出現死結情況;



 

mysql中的外鍵是什嗎?以及需要使用外鍵嗎?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.