外键(foreign key)
概念
foreign key,外面的主键,其他表的主键!
如果一个实体A的某个字段,刚好指向或者引用另一个实体B的主键,那么实体A的这个字段就是叫作外键!
作用
外键的意义就是用来约束关系内的实体!
思考:
为什么要有外键约束?
因为比较符合现实中正常的业务逻辑!
假如上面的学生表中的班级字段出现了一个11班,就不符合逻辑,因为班级表中根本就没11班!
所以,外键的约束主要体现在以下的两个方面:
1, 增加子表记录的时候,是否有与之对应的父表记录!
2, 当删除或更改主表记录的时候,从表应该如何处理相关的记录!
定义
语法形式: foreign key(子表的字段名) references 父表(父表的主键)
-- -------------------外键(建表后再添加)--------------------------------------------------------------------
create table student( -- |
stu_id tinyint unsigned auto_increment primary key, -- |
stu_name varchar(10) not null default '', -- |
stu_tea_id tinyint unsigned -- |
)engine=innodb default charset=utf8; -- |
-- |
create table teacher( -- |
tea_id tinyint unsigned auto_increment primary key, -- |
tea_name varchar(10) not null -- |
)engine=innodb default charset=utf8; -- |
alter table student add foreign key(stu_tea_id) references teacher(tea_id); -- |
-- -----------------------------------------------------------------------------------------------------------------
-- -------------------外键(建表时添加)--------------------------------------------------------------------------------
#这种方式必须先添加父表再添加子表 -- |
#父表 -- |
create table teacher( -- |
tea_id tinyint unsigned auto_increment primary key, -- |
tea_name varchar(10) not null -- |
)engine=innodb default charset=utf8; -- |
#子表 -- |
create table student( -- |
stu_id tinyint unsigned auto_increment primary key, -- |
stu_name varchar(10) not null default '', -- |
stu_tea_id tinyint unsigned, -- |
foreign key(stu_tea_id) references teacher(tea_id) -- |
)engine=innodb default charset=utf8; -- |
-- --------------------------------------------------------------------------------------------------------------------------
思考:
此时应该先插入父表的数据还是子表的数据?
应该先插入父表的数据!
添加数据
以上,只是外键约束的一个方面:就是增加子表记录的时候,是否有与之对应的父表记录!
还有一个方面:就是当删除或更改主表记录的时候,从表应该如何处理相关的记录!
此时,我们就需要设置相关的级联操作!
设置级联
所谓的级联操作,就是在操作一张表的时候,会影响到另一张表,也叫作关联操作或关联动作!
一般分成以下的两个操作:
主表更新
语法形式为:on update[级联操作]
主表删除
语法形式为:on delete[级联操作]
我们应该在定义一个外键的时候顺便设置级联操作!所以同样应该在子表上进行设置!
这里的级联操作常见的有三种形式:
cascade:同步操作,也就是当主表的主键字段更新或删除的时候,从表的外键字段也进行相应的更新或删除
set null:设置为null,也就是当主表的主键字段更新或删除的时候,从表的外键字段就设置为null,当前,有一个前提是从表的外键没有非空约束!
restrict:就是拒绝主表更新或删除!
由于刚才定义外键的时候没有设置级联操作,我们可以先将这个外键删除,然后再增加一个外键
删除外键
alter table 表名 drop foreign key 外键名;
注意:
这里的外键名不是子表的字段名,而是在定义外键的时候由系统自动设定的,我们可以通过数据表的创建语句来查看:'
show create table studentG
alter table student drop foreign key student_ibfk_1;
重新添加外键且设置级联操作
alter table 表名 add foreign key (子表的字段名) references 父表名(父表的主键) 级联操作
这里的级联操作可以有两个:
on update cascade|set null|restrict
on delete cascade|set null|restrict
#当主表更新的时候子表同步更新,当主表删除的时候就设置为null
alter table student add foreign key(stu_tea_id) references teacher(tea_id) on update cascade on delete set null;
------- ----------------------------------------------------完结,不足之处请指点啦 ---------------------------------------------------
foreign