【MySQL】外键约束

文章目录

      • (一)外键约束
      • (二)外键约束的功能
      • (三)学生表和班级表
        • (1)练习
        • (2)两个问题
        • (3)解决方案
        • (4)结果展示
      • (四)外键策略
        • (1)策略一:手动置空
        • (2)策略二:级联操作 on update on delete
        • (3)级联置空 set null

(一)外键约束

  • 外键:是指表中某个字段的值依赖于另一个表中的某个字段的值(被依赖的字段必须要有主键约束或者唯一约束

  • 外键约束:用户实现数据库表的参照完整性。外键约束可以使两张表紧密结合起来,特别是对于删除/修改级联操作时,会保证数据的完整性。

  • 子表/从表:使用外键约束的表 (学生表:学号,姓名,性别,年龄,班级号)

  • 父表/主表:含有被依赖的字段的表(班级表:班级号,班级名)

注意:学生表中含有班级号


(二)外键约束的功能

  • 同一个字段有着大量重复数据,使用外键约束后,修改只修改一次父表中的数据即可,节省时间;

注意:外键约束只有表级约束


(三)学生表和班级表

(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;

【MySQL】外键约束_第1张图片

【MySQL】外键约束_第2张图片

(2)两个问题

  1. 问题一:班级表中只有1, 2 ,那我们在学生表中插入3班学生呢?
    insert into stu_table values (NULL, '测试名', '女', 18, 3 );

【MySQL】外键约束_第3张图片
结果很明显添加成功,但这种做法就是错误的,因为根本没有c_id = 3的班

  1. 问题二:那我们删除班级表中的一条记录呢,那2班的人怎么办?
    比如:删除xg1902
    delete from class_table where c_id = 2;
    在这里插入图片描述
    那么学生表中c_id = 2的学生有没有被删除呢??很显然并没有
    【MySQL】外键约束_第4张图片

(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)
);

【MySQL】外键约束_第5张图片

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)结果展示

【MySQL】外键约束_第6张图片
【MySQL】外键约束_第7张图片


(四)外键策略

(1)策略一:手动置空

【MySQL】外键约束_第8张图片

(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;

【MySQL】外键约束_第9张图片

(3)级联置空 set null

举个例子,学生表中有4个2班的学生, 班级表有1班和2班,假设删除班级表中的2班,出现的情况如下:

  • 外键约束的外键策略set null:学生表中的所有2班学生的班级号为null

你可能感兴趣的:(mysql,mysql,数据库,sql,外键约束)