外鍵是為了保證資料的完整性,但也會帶來許多副作用,使用不當會使資料處理變得複雜,在資料量大的時候會明顯影響性能。是以,工具是工具,具體如何使用,根據自己情況取舍。
注意:目前在mysql資料庫中,隻有innodb存儲引擎支援外鍵。
外鍵定義:兩個有關聯關系的表,其中一個表中的某個字段a指向另一個表中的主鍵b,我們稱a是外鍵。在它們兩個的關系中,b所在表我們稱之為主表,而a所在字段我們稱之為從表。
如果沒有定義兩個表之間的關聯操作,那麼a隻是邏輯上的外鍵,定義其之間的關聯操作後,a才是我們今天要讨論的真正外鍵。
文法:foreign key (字段名) references 主表名 (字段名) on [update | delete] [ cascade | set null | restrict ]
(1)可定義的級聯操作:
on delete 定義當主表删除時記錄時從表的操作
on update 定義當主表更新記錄時執行的操作
(2)可設定的動作:
cascade : 串聯操作,就是子表跟主表動作一樣,删除或更新
set null : 當主表更改時,子表的外鍵字段設定為null
restrict : 限制主表做更改
舉例:
第一步:建立兩張表 班級 和 學生,并且以class_id為外鍵對班級表關聯。
create table class (
id int primary key auto_increment,
class_name varchar(20) not null
);
create table student (
name varchar(20) not null,
class_id int ,
foreign key (class_id) references class (id)
on delete cascade
on update set null
第二步:分别向兩張表添加資料
insert into class values
(null,'A'),
(null,'B');
insert into student values
(null,'xiaohong',1),
(null,'xiaoming',2),
(null,'xiaogang',1);
此時我們首先看一下表中的資料,以便跟我們稍後的測驗作資料對比。
第三步:删除和修改,并檢視結果
剛才我們設定的是 on delete cascade,讓我們來驗證一下結果。
當我們删掉 class 表中的 id=1 的資料後,student 表中,class_id 為1的資料預設都幫我們删掉了。
再來一個更新的試試: