來自:金色旭光
連結:http://www.cnblogs.com/goldsunshine/p/9226903.html
在資料庫的操作中,外建是很常見的操作。近期花了一些時間學習外來鍵,整理學習筆記。
外來鍵說明
以一個例子來說明外來鍵。正值俄羅斯世界盃期間,32支國家隊比賽精彩異常,其中巨星球星毫無疑問:C羅、梅西、內馬爾。這裡有兩張表:
表A,其中姓名是主鍵。
主鍵:為了保證資料的完整性和唯一性,每一個表能夠唯一代表該表的欄位,不會出現重覆。例如身份證ID號。表中運動員姓名也基本上沒有重名,在表A中能夠作為唯一標示。
表B:其中球隊排名是主鍵,當家球員是外來鍵,關聯的是表A的姓名。這是我們把表A稱之為主表,表B稱之為從表。
在如上兩張表中,我們可以說:表B的外來鍵是欄位”當家球員”,關聯的欄位是表A的姓名。姓名是表A的主鍵,外來鍵的要求:一個表的外來鍵關聯另一個表的主鍵。如果插入韓國隊,沒有當家球員,外來鍵的值為空,這麼增加可以嗎?是可以的,主鍵的值要求一定存在,並且是唯一的,而外來鍵的要求是:可以是空值,也可以重覆。
兩張表目前的連線關係如下圖:
簡單總結外來鍵的特點:
1、一張表的外來鍵一定是關聯到另一張表的主鍵
2、外來鍵可以是空值和重覆,主鍵不可為空值且一定是唯一
那麼對於一張表來說,外來鍵有什麼好處呢。有一個很貼切生活的解釋。一個人在公司中一張部門表A:
另一張是工資表B:
表A中的工號ID 是主鍵,表B 中的姓名是外來鍵。現在如果張三,工號1,因為世界盃看球被開出了,這是要從表A中將工號ID為1的員工刪除,那麼相應的表B中工資表也應該將其刪除。假如操作人員忘記刪除了工資表,人不在了工資照發,老闆豈不是要吐血。如果沒有外來鍵關聯需要人工手動刪除,有外來鍵關聯能夠透過外來鍵的聯絡將其刪除。這就是外來鍵的好處之一。外來鍵的好處有如下幾個:
1、保證資料的完整性
2、保證資料的一致性
資料庫具體操作
建立兩張表
表Country:主鍵是世界排名,欄位是國家名稱
表Playeers:外來鍵是國家排名
建立表
首先建立Country表,設定ranking為主鍵
然後建立Playeers,設定c_id為外來鍵。關聯到表Country的rangking欄位。其中外來鍵設定的陳述句是
foreign key(c_id) references Country(ranking)
插入資料
Country插入資料
Playeers插入資料
單表查詢
查詢出表Country中所有的欄位
查詢出表Playeers中所有的欄位
連表查詢
看到上面兩張表,有沒有人感興趣運動員收入和國家排名有沒有關係呢?國家排名在表Country中,薪水在表Playeers中。如果查詢兩張表呢?答案是使用外來鍵所關聯的欄位查詢。
查詢表Country中的ranking欄位,name欄位和Playeers中的solary,透過Playeers中的c_id欄位和Country中的ranking欄位關聯兩張表。因為c_id和ranking是一一對應的關係,所以能夠很好查詢。這裡要重點說明,連表查詢不是外來鍵特有的,兩張表只要有相同的欄位都可以連表查詢,而外來鍵因為是一一對應關係,所以很適合連表查詢。
實際上,外來鍵的好處:”保證資料的完整體”,現在兩張表可以合成一張表。例如查詢出全部的欄位,可以看到ranking和c_id是一樣的,透過這兩個欄位能夠連線兩張表。
外來鍵特性
完整性
前面總結外來鍵的優點有兩個:保證資料的完整性和保證資料的一致性。完整性是如果體現的呢?比如說,我現在想在插入一個我喜歡的球員:蘇神,蘇亞雷斯。9號球衣,烏拉圭球員,排名22,年薪1200萬歐元。
但這時插入失敗,報錯“不能增加到一個外來鍵關聯的表”。這是因為蘇神的國家排名是22,而在表Country的ranking中並沒有22這個值,所以Playeers也不能插入。外來鍵保證資料的完整性就是在附表中插入資料時,外來鍵所在的欄位的值要檢查主表中對應欄位中是否有相同的值,如果有就能夠插入,沒有就不能插入。這裡所說一句:如果插入蘇神時排名去掉,是可以插入的,如果蘇神是巴西人,c_id是2,也是能夠插入的。這裡體現的是外來鍵取值準則:可以空值或者是重覆,或者一定要是主鍵之中的值。
一致性
說完了完整性,外來鍵如何保證資料的一致性?例如我要刪除表Country,結果報錯:
報錯:”不能夠刪除或者更新一個父列,有外來鍵關關聯”。因為如果刪除了Country,Playeers表的外來鍵關聯就失去了,這樣做外來鍵是不允許的。以前面部門表和工資表為例,試想員工離職了,把其從部門表中刪除,而工資表忘記刪了,結果人不在工資照發,這個鍋要誰來背?聰明的做法就是外來鍵關聯,這樣刪部門表時會提示還有外來鍵關聯的工資表,就不會人不在還發工資了。
刪除外來鍵連線
刪除有外來鍵關聯的表有兩種方式:
1、先刪除從表,即表Playeers,然後刪除主表Country
2、先刪除外來鍵約束,再刪除主表
以方法2刪除外來鍵約束為例:格式:alter table 表名 drop foreign key 外來鍵_id;
外來鍵ID查詢方法:show create table Playeers
刪除外來鍵
沒有外來鍵約束之後就能正常刪除表Country。
●編號363,輸入編號直達本文
●輸入m獲取文章目錄
Web開發
更多推薦《18個技術類公眾微信》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。