外來鍵是資料庫一級的乙個完整性約束,就是資料庫基礎理論書中所說的「參照完整性」的資料庫實現方式。
外來鍵屬性當然是可以去掉的,如果你不想再用這種約束,對程式設計當然不會有什麼影響,但相應的錄入資料的時候就不對錄入的資料進行「參照完整性」檢查了。
例如有兩個表
a(a,b) :a為主鍵,b為外來鍵(來自於b.b)
b(b,c,d) :b為主鍵
如果我把字段b的外來鍵屬性去掉,對程式設計沒什麼影響。
如上面,a中的b要麼為空,要麼是在b的b中存在的值,有外來鍵的時候,資料庫會自動幫你檢查a的b是否在b的b中存在。
1、外建表達的是參照完整性:這是資料固有的,與程式無關。因此,應該交給dbms來做。
2、使用外建,簡單直觀,可以直接在資料模型中體現,無論是設計、維護等回有很大的好處,特別是對於分析現有的資料庫的好處時非常明顯的--前不久我分析了乙個企業現有的資料庫,裡面的參照完整性約束有的是外來鍵描述,有的是用觸發器實現,感覺很明顯。當然,文件裡可能有,但是也可能不全,但是外來鍵就非常明顯和直觀。
3、既然我們可以用觸發器或程式完成的這個工作(指參照完整性約束),dbms已經提供了手段,為什麼我們要自己去做?而且我們做的應該說沒有rdbms做得好。實際上,早期的rdbms並沒有外來鍵,現在都有了,我認為資料庫廠商增加這個功能是有道理的。從這個角度來說,外來鍵更方便。
4、關於方便,根據我帶專案的情況來看,程式設計師確實有反映,主要是在除錯時輸入資料麻煩:如果資料可以違反參照完整性,那麼就是說參照完整性本身就不對名譽業務衝突,此時也不應該用觸發**程式實現;否則,說明資料是錯誤的,根本就不應該進入資料庫!而且,這也應該是測試系統的乙個內容:阻止非法資料。實際上,前台程式應該對這種提交失敗做出處理。資料是企業的而非程式的,儲程式要盡量與資料分離,反之亦然。
最後說一下,建鍵幾個原則:
1、 為關聯字段建立外來鍵。
2、 所有的鍵都必須唯一。
3、避免使用復合鍵。
4、外來鍵總是關聯唯一的鍵字段。
定義主鍵和外來鍵主要是為了維護關聯式資料庫的完整性,總結一下:
一、主鍵是能確定一條記錄的唯一標識,比如,一條記錄包括身份正號,姓名,年齡。身份證號是唯一能確定你這個人的,其他都可能有重複,所以,身份證號是主鍵。
外來鍵用於與另一張表的關聯。是能確定另一張表記錄的字段,用於保持資料的一致性。比如,
a表中的乙個字段,是
b表的主鍵,那他就可以是
a表的外來鍵。
二、主鍵、外來鍵和索引的區別
定義:
主鍵--
唯一標識一條記錄,不能有重複的,不允許為空 外來鍵
--表的外來鍵是另一表的主鍵
, 外來鍵可以有重複的
, 可以是空值 索引
--該欄位沒有重複值,但可以有乙個空值
作用: 主鍵
--用來保證資料完整性 外來鍵
--用來和其他表建立聯絡用的 索引
--是提高查詢排序的速度
個數: 主鍵
--主鍵只能有乙個 外來鍵
--乙個表可以有多個外來鍵 索引
--乙個表可以有多個唯一索引
資料庫中外鍵的作用
為了一張表記錄的資料不要太過冗餘。這和軟體工程的模組化思想差不多類似,只不過在資料庫中是對錶關係進行解耦,盡量讓表 記錄的資料單一化。就如你貼的中,把成績和學生資訊放在一張表中就太冗餘了,成績完全可以以學生的id作為區分標識。你想想,你的圖中的第一章表分割成了表1和表2,表2的學號引用了表1的學號字...
資料庫的主鍵和外來鍵
資料庫主鍵是指表中乙個列或列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵,通過它可強制表的實體完整性。乙個表只能有乙個 primary key 約束,而且 primary key 約束中的列不能接受空值。主鍵具有的特點 唯一性 非空性。思考 主鍵帶來了什麼樣的優點和缺點?外來鍵...
mysql中外鍵的作用和舉例
1 基本介紹 外來鍵作用 使兩張表形成關聯,外來鍵只能引用外表中的指定列的值!建立外來鍵的前提 本表的列必須與外來鍵型別相同 外來鍵必須是外表的主鍵 指定外來鍵關鍵字 foreign key 列名 引用外來鍵關鍵字 references 外來鍵表名 外來鍵列名 事件觸發限制 on delete和on...