独角兽企业重金招聘Python工程师标准>>>
前提:使用外键功能,存储引擎需为InnoDb类型;
一、建表时同时创建外键
1、情景,班级表 和 学生表,一对多的关系。
2、班级表称A主表,学生表称B从表,当B表中有个字段使用了A表主键作为字段内容,此字段称为外键;
3、首先创建班级表,A表
4、创建学生表,B表,使用A表的id作为其外键
注:1、外键字段自动添加了索引
2、在没有明确指定约束名时,会自动分配 一个约束名
5、为什么说外键是约束
在默认的严格模式下:
从表中外键字段不能使用主表中不存在的主键ID
如果从表使用了主表字段中的数据后,主表这些记录将无法删除
二、删除外键
语法:alter table 从表名称 drop foreign key 外键的约束名(上面的约束名为 studentinfo_ibfk_1)
注:删除外键后,原外键的索引会保留。
三、手工添加外键
格式:alter table 从表名 add foreign key (从表中字段名称) references 主表名 (主表的主键字段名)
四、外键字段的联动操作
上面看到,从表外键字段使用了主表的id,在主表中该id记录删除不了,实际并不一定不能删除
外键约束分3种情况:
stric,严格模式,默认的方式,不允许修改和删除
cascade,级联,主表修改或删除,从表跟着变化
set null,设置为null,主表数据删除,从表外键字段变为null
比较合理的方式是:
on update cascade
on delete set null
我们在定义外键时,不一定非要用严格模式,可以根据需求,修改或删除采用 级联 或 set null
注:如果外键字段在删除时使用的是set null 方式,一定要看一下外键字段是否是not null,如果是,要修改为允许为null
也可只设置一个 on update casade;只修改生效,不能删除啦
例:操作演示,修改主键,从表主键自动被修改。
操作演示:删除主表ID