【MySQL】外键约束
(一)外键约束
- 外键:是指表中某个字段的值依赖于另一个表中的某个字段的值(
被依赖的字段必须要有主键约束或者唯一约束
) 外键约束:用户实现数据库表的参照完整性。外键约束可以使两张表紧密结合起来,特别是对于删除/修改级联操作时,会保证数据的完整性。
子表/从表:使用外键约束的表 (学生表:学号,姓名,性别,年龄,班级号)
- 父表/主表:含有被依赖的字段的表(班级表:班级号,班级名)
注意:学生表中含有班级号
(二)外键约束的功能
- 同一个字段有着大量重复数据,使用外键约束后,修改只修改一次父表中的数据即可,节省时间;
注意:外键约束只有表级约束
(三)学生表和班级表
(1)练习
1 | -- 创建主表(班级表) |
(2)两个问题
1) 问题一:班级表中只有1, 2 ,那我们在学生表中插入3班学生呢?insert into stu_table values (NULL, '测试名', '女', 18, 3 );
结果很明显添加成功,但这种做法就是错误的,因为根本没有c_id = 3的班
2) 问题二:那我们删除班级表中的一条记录呢,那2班的人怎么办?
比如:删除xg1902delete from class_table where c_id = 2;
那么学生表中c_id = 2的学生有没有被删除呢??很显然并没有
(3)解决方案
- 产生原因:未将外键约束语法添加进去
- 添加外键约束(
只有表级约束
):
1.创建表时添加表级外键约束
语法:constraint 约束名 foreign key 子表名 (子表字段名) references 父表名 (父表唯一字段名)
1 | -- 创建从表(学生表) |
2.对已创建的表添加表级外键约束alter table 子表名 add constraint 约束名 foreign key 子表名 (子表字段名) references 父表名 (父表唯一字段名);
1 | -- 已存在的表添加表级外键约束 |
(4)结果展示
(四)外键策略
(1)策略一:手动置空
(2)策略二:级联操作 on update on delete
创建约束 外键策略;
什么是级联呢?
开启级联后,更新/删除一个主表的主键值(唯一字段),系统会相应的更新/删除所有从表匹配的外键值。
先删除旧的外键约束,在添加含有外键策略(级联操作)的外键约束
- 语法格式:
1
2
3
4
5-- 1.先删除旧的外键约束
alter table 从表名 drop foreign key 外键约束名;
-- 2.重新添加带有级联操作(更新/删除)的外键约束
alter table 从表名 add constraint 外键约束名 foreign key (从表字段名) references 主表名 (主表字段名) on update cascade on delete cascade; - 示例:
1 | -- 1.先删除旧的外键约束 |
(3)级联置空 set null
举个例子,学生表中有4个2班的学生, 班级表有1班和2班,假设删除班级表中的2班,出现的情况如下:
- 外键约束的外键策略set null:学生表中的所有2班学生的班级号为null
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 code-016!