外來鍵及其約束理解
一:首先是外來鍵的定義
如果一個欄位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>