【MySQL】外键约束
·
文章目录
(一)外键约束
-
外键:是指表中某个字段的值依赖于另一个表中的某个字段的值(
被依赖的字段必须要有主键约束或者唯一约束
) -
外键约束:用户实现数据库表的参照完整性。外键约束可以使两张表紧密结合起来,特别是对于删除/修改级联操作时,会保证数据的完整性。
-
子表/从表:使用外键约束的表 (学生表:学号,姓名,性别,年龄,班级号)
-
父表/主表:含有被依赖的字段的表(班级表:班级号,班级名)
注意:学生表中含有班级号
(二)外键约束的功能
- 同一个字段有着大量重复数据,使用外键约束后,修改只修改一次父表中的数据即可,节省时间;
注意:外键约束只有表级约束
(三)学生表和班级表
(1)练习
-- 创建主表(班级表)
create table class_table(
c_id int(4) primary key auto_increment,
c_name varchar(10)
);
-- 创建从表(学生表)
create table stu_table(
s_id int PRIMARY key auto_increment,
s_name varchar(10) not null,
s_sex char(1) check(s_sex = '男' or s_sex = '女'),
s_age int(3) check(s_age > 0 and s_age < 100),
c_id int(4)
);
-- 班级表添加数据
insert into class_table values(NULL, 'xg1901'), (NULL, 'xg1902');
-- 查看班级表数据
select * from class_table;
-- 学生表中插入数据
insert into stu_table values (NULL, '香菱', '女', 18, 1);
insert into stu_table values (NULL, '行秋', '男', 18, 2);
insert into stu_table values (NULL, '胡桃', '女', 16, 2);
insert into stu_table values (NULL, '班尼特', '男', 18, 1);
-- 查看学生表数据
select * from stu_table;
(2)两个问题
- 问题一:班级表中只有1, 2 ,那我们在学生表中插入3班学生呢?
insert into stu_table values (NULL, '测试名', '女', 18, 3 );
结果很明显添加成功,但这种做法就是错误的,因为根本没有c_id = 3的班
- 问题二:那我们删除班级表中的一条记录呢,那2班的人怎么办?
比如:删除xg1902
delete from class_table where c_id = 2;
那么学生表中c_id = 2的学生有没有被删除呢??很显然并没有
(3)解决方案
-
产生原因:未将外键约束语法添加进去
-
添加外键约束(
只有表级约束
):
1.创建表时添加表级外键约束
语法:constraint 约束名 foreign key 子表名 (子表字段名) references 父表名 (父表唯一字段名)
-- 创建从表(学生表)
create table stu_table(
s_id int PRIMARY key auto_increment,
s_name varchar(10) not null,
s_sex char(1) check(s_sex = '男' or s_sex = '女'),
s_age int(3) check(s_age > 0 and s_age < 100),
c_id int(4),
-- 创建时添加表级外键约束
constraint fk_c_id foreign key (c_id) references class_table (c_id)
);
2.对已创建的表添加表级外键约束
alter table 子表名 add constraint 约束名 foreign key 子表名 (子表字段名) references 父表名 (父表唯一字段名);
-- 已存在的表添加表级外键约束
alter table stu_table add constraint fk_c_id foreign key (c_id) references class_table (c_id);
(4)结果展示
(四)外键策略
(1)策略一:手动置空
(2)策略二:级联操作 on update on delete
创建约束 外键策略;
什么是级联呢?
开启级联后,更新/删除一个主表的主键值(唯一字段),系统会相应的更新/删除所有从表匹配的外键值。
先删除旧的外键约束,在添加含有外键策略(级联操作)的外键约束
- 语法格式:
-- 1.先删除旧的外键约束
alter table 从表名 drop foreign key 外键约束名;
-- 2.重新添加带有级联操作(更新/删除)的外键约束
alter table 从表名 add constraint 外键约束名 foreign key (从表字段名) references 主表名 (主表字段名) on update cascade on delete cascade;
- 示例:
-- 1.先删除旧的外键约束
alter table stu_table drop foreign key fk_c_id;
-- 2.重新添加带有级联操作(更新/删除)的外键约束
alter table stu_table add constraint fk_c_id foreign key (c_id) references class_table (c_id) on update cascade on delete cascade;
-- 级联更新
update class_table set c_id = 1 where c_id = 3;
-- 级联删除
delete from class_table where c_id = 2;
(3)级联置空 set null
举个例子,学生表中有4个2班的学生, 班级表有1班和2班,假设删除班级表中的2班,出现的情况如下:
- 外键约束的外键策略set null:学生表中的所有2班学生的班级号为null
更多推荐
已为社区贡献2条内容
所有评论(0)