1、外键约束
特点:
(1)一个表可以有很多个外键约束
(2)外键约束是需要一个表的两个字段或两个表的两个字段之间建立外键约束
(3)外键约束一定是在从表/子表中建立的
(4)在从表中外键约束的列,与在主表中外键约束参考的列,这两个列的名称可以不同,
但是意义、数据类型必须一致。
(5)外键约束是同时约束双方的行为的
对于主表来说:修改和删除就受约束了
对于从表来说:添加和修改就受约束了
(6)主表被参考的字段/列必须是键列
建表时,先建主表,再建从表。
删表时,先删从表,再删主表。
从表、子表:参考别人的,依赖别人的
主表、父表:被参考的,被依赖的
举例:
(1)部门表和员工表
员工表中有一个字段,表示该员工所在的部门
部门表是主表
员工表是从表,说员工选择进入哪个部门
这样的话,外键建立在员工表
部门表中表示部门编号,用did表示,int类型
员工表中表示该员工所在的部门,我用编号表示,可以使用did,也可以使用deptid int类型
(2)学生表,课程表,选课表
主表:学生表和课程表
从表:选课表,这个表有两个外键,一个参考学生表,一个参考课程表
2、约束的等级(5个)
(1)Cascade方式:级联
主动权在主表上。
如果主表被依赖字段修改了,从表对应的外键字段跟着修改
如果主表被依赖字段的记录删除了,从表对应的外键字段的记录也会删除
(2)Set null方式
主动权在主表上。
如果主表被依赖字段修改了,从表对应的外键字段设置为null
如果主表被依赖字段的记录删除了,从表对应的外键字段的值设置为null
这里要求,外键字段必须不能有非空约束。
(3)No action方式:不作为
(4)Restrict方式:严格
如果主表的被依赖字段的值被引用了,那么主表对该字段的修改和删除就被完全限制了。就不能和删除。
主表没有主动权。必须先处理从表对应的值,然后才能修改和删除。
(5)Set default方式:mysql的Innodb引擎不支持。
3、如何在建表时指定外键
create table 【数据库名.】从表名称(
字段名1 xxInt primary key auto_increment,
字段名2 数据类型 【unique key】【not null】