外鍵約束:foreign key
*外鍵 foreign key*
1、概念:如果一個實體的(student)的某個字段,指向(引用)另個實體(class)的主鍵
(class:class_id),就稱為student實體的class_id是 外鍵 。
【聲名】被指向的實體,稱之為主實體(主表),也叫父實體(父表)。class
負責指向的實體,稱之為從實體(從表),也叫子實體(子表)。student
作用:用於約束處於關系內的實體。
比如說:我們去一家很火的餐廳吃飯,去餐廳之前我們是在網上預約了位置的客戶,與此同時也剛好來了另外一桌未預約的客戶,當餐廳恰好空出一個用餐位置。
兩大限制:
1)增加子表記錄時,是否有之對應的父表記錄。如果有,則數據插入成功;否則,數據插入失敗。
2)在刪除或者更新主表記錄時,從表應該如何處理相關的記錄。
2、定義外鍵:
在從表上,增加一個 外鍵字段,指向主表的主鍵。使用關鍵字 foreign key
語法:foreign key ([從表]外鍵字段) 主表名 (關聯字段)
3、例子解釋
#表一:學生信息表(主表)
CREATE TABLE stu_info (
id int(10) primary key auto_increment,
name varchar(10) not null,
sex varchar(10),
birth varchar(15)) character set utf8;
#表二:學生成績表(從表)
CREATE TABLE stu_marks (
id int(10) primary key auto_increment,
CHINESE int (3),
MATH int (3),
ENGLISH int (3),
foreign key (id) references stu_info (id)) character set utf8; #設置外鍵約束,foreign key ([從表]外鍵字段) 主表名 (關聯字段)。
【解析】:
設置“外鍵約束”後的作用,相當於事先建立了一個庫,當從表需要插入數據時只能插入 被約束的值,也就是 庫 中已經存在的值。
比如我們這邊的例子是設置 外鍵約束 是 id,所以我們在給從表 插入數據時就會有約束,從表 的id值必須是在 主表 中已經存在的,否則報錯。
【報錯例子】:
報錯原因:
我們給學生成績表(從表)插入信息時,由於學生信息表(主表)中不存在 id=2016888888 的學生信息,所以插入信息失敗。
4、刪除操作:
4.1 刪除 ‘從表’ 中的數據:不會影響 主表 的數據
例子:delete from stu_marks where id=2016030638;
、
4.2刪除 ‘主表’ 中的數據:
例子:delete from stu_info where id=2015020314;
解析:由於開啟了外鍵約束,會檢查外鍵約束,所以我們無法“刪除”或者“更新”主表 stu_info中的數據。
4.2.3刪除/更新 ‘主表’ 中的數據方法:
1)關閉外鍵約束檢查:set foreign_key_checks=0;
4.2.4禁止刪除/更新 ‘主表’ 中的數據:
1)打開外鍵約束檢查:set foreign_key_checks=1;
外鍵約束:foreign key