一:首先是外鍵的定義
如果一個字段X在一張表(表一)中是主關鍵字,而在另外一張表(表二)中不是主關鍵字,則字段X稱為表二的外鍵;換句話說如果關系模式R1中的某屬性集不是自己的主鍵,而是關系模式R2的主鍵,則該屬性集稱為是關系模式R1的外鍵。
二:主鍵表和外鍵表的理解
(1)以公共關鍵字作主鍵的表為主鍵表(父表,主表)
(2)以公共關鍵字作外鍵的表為外鍵表(從表,外表)
舉個例子:
這里有2張表(student和depart)學生表和院系表,這里的字段departNum就是學生表的外鍵,這里的外鍵表是學生表,主鍵表是院系表。
四:外鍵的作用
各種書籍和網上的資料大多都是抽象空洞的解釋:保證數據的完整性和一致性。
個人對此的理解與接下來的外鍵約束一起講。
五:外鍵約束
Mysql 下,外鍵設置:
on delete 規則:
1、CASCADE:級聯
(1)所謂的級聯刪除,就是刪除主鍵表的同時,外鍵表同時刪除。
(2)以上面的例子將就是,假如院系表中的某個院系被刪除了,那么在學生表中要想查詢這個被刪除的院系號所對應的院信息就會報錯,因為已經不存在這個系了,所以,刪除院系表(主鍵表)時必須刪除其他與之關聯的表,這里就說明了外鍵的作用,保持數據的一致性、完整性。當然反過來講,你刪除學生表中的記錄,並不影響院系表中的數據,你查詢院系號也能正確查詢。所以刪除外鍵表中的數據並不影響主鍵表。
2、NO ACTION(非活動,默認)、RESTRICT:約束/限制
當取值為No Action或者Restrict時,則當在主鍵表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除。(即外鍵表約束主鍵表)
3、SET NULL
當取值為Set Null時,則當在主鍵表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(,一樣是外鍵表約束主鍵表,不過這就要求該外鍵允許取null)。
NO ACTION和RESTRICT的區別:只有在及個別的情況下會導致區別,前者是在其他約束的動作之后執行,后者具有最高的優先權執行。
六.實際應用
對象模型中的數據如下:
package org.model; public class Student { private String stuNum; private String stuName; <span style="color:#FF0000;">private Depart depart;</span> public String getStuNum() { return stuNum; } public String getStuName() { return stuName; } public Depart getDepart() { return depart; } public void setStuNum(String stuNum) { this.stuNum = stuNum; } public void setStuName(String stuName) { this.stuName = stuName; } public void setDepart(Depart depart) { this.depart = depart; } }
這里設計對象模型時的屬性並不是設計成departNum這個外鍵,而是整個Depart對象,這樣做的好處是在查詢時,就不用通過外鍵或者連接查詢再多查詢一次
若要通過外鍵查詢:
<span style="font-size:18px;"> Query query=session.createQuery("from Student as stud where <span style="color:#FF0000;">stud.depart.departNum=:num</span>"); query.setString("num","890");</span>