外鍵約束
外鍵是構(gòu)成表與表關(guān)聯(lián)的唯一途徑。一個表的外鍵引用另一個表或自身表的主鍵,外鍵所在的表稱為從表,外鍵引用的表稱為主表。
創(chuàng)建外鍵有以下兩個途徑:
- 在創(chuàng)建表的時候指定某個列為外鍵列;
- 在修改表的時候添加某個列為外鍵列。
外鍵有以下特性:
- 外鍵必須是另一表或自身表的主鍵的值;
- 外鍵可以重復(fù);
- 外鍵可以為空;
- 一張表中可以有多個外鍵。
1.創(chuàng)建表時指定外鍵列
(1)外鍵的關(guān)鍵詞是FOREIGN KEY,創(chuàng)建一個數(shù)據(jù)庫exam,然后在該數(shù)據(jù)庫中先創(chuàng)建一個部門表dept,然后再創(chuàng)建一個員工表emp,如圖1-1所示:
圖1-1 創(chuàng)建數(shù)據(jù)庫與表
圖1-1中,建立外鍵的語句如下:
- CONSTRAINT 約束名稱 FOREIGN KEY(外鍵列名) REFERENCES 關(guān)聯(lián)表(關(guān)聯(lián)表的主鍵)
創(chuàng)建emp表的sql語句如下:
CREATE TABLE emp(
empno INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50),
deptno INT ,
CONSTRAINT fk_emp_dept FOREIGN KEY(deptno) REFERENCES dept(deptno)
語句中,外鍵列名deptno是指emp表中外鍵的名稱,關(guān)聯(lián)表是dept,關(guān)聯(lián)表的主鍵名為deptno,與外鍵名稱相同,也可以不同。需要注意的是emp表中引用了dept表的主鍵,因此創(chuàng)建表時要先創(chuàng)建dept表,再創(chuàng)建emp表,否則會出錯。
(2)向dept表中插入記錄,如圖1-2所示:
圖1-2 dept表記錄
(3)emp表的主鍵是自增長的,因此向emp表中插入記錄時可以不用指定主鍵值,如圖1-3所示:
圖1-3 向emp表中插入記錄
圖1-3中,插入的記錄沒有提供外鍵的值,外鍵的值為null,表明了外鍵可以為null。
(4)向emp表中插入外鍵值相同的兩條記錄,如圖1-4所示:
圖1-4 插入外鍵值相同的記錄
圖1-4中,張三和李四的部門號相同,表明了外鍵是可以重復(fù)的。
(5)向emp表中插入一條記錄,該記錄的部門號在部門表中并不存在,如圖1-5所示:
圖1-5 插入不存在的外鍵值
圖1-5中,當(dāng)插入的記錄的外鍵值沒有引用dept表中的主鍵時,插入失敗,因此,外鍵值如果不為空,那么一定要是主表的主鍵中的任意一個。
2.修改表是指定外鍵列
修改表時添加外鍵列的語句如下:
ADD CONSTRAINT 約束名稱 FOREIGN KEY(外鍵列名) REFERENCES 關(guān)聯(lián)表(關(guān)聯(lián)表的主鍵);
(1)將emp表刪除,重新創(chuàng)建一個emp表,如圖1-6所示:
圖1-6 創(chuàng)建無外鍵的emp表
(2)為emp表添加外鍵,如圖1-7所示:
圖1-7 為表添加外鍵約束
(3)向emp表中添加一條記錄,如圖1-8所示:
圖1-8 插入記錄
圖1-8中,插入一條記錄,該記錄的外鍵值為50,而dept表的主鍵值不存在這個值,因此違反了外鍵約束,所以插入失敗,表明修改表時添加外鍵約束成功。
本文版權(quán)歸傳智播客java學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客java學(xué)院