【MySQL】外键约束

article/2025/9/29 11:10:40

文章目录

      • (一)外键约束
      • (二)外键约束的功能
      • (三)学生表和班级表
        • (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;

在这里插入图片描述

在这里插入图片描述

(2)两个问题

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

在这里插入图片描述
结果很明显添加成功,但这种做法就是错误的,因为根本没有c_id = 3的班

  1. 问题二:那我们删除班级表中的一条记录呢,那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

http://chatgpt.dhexx.cn/article/78qkbqfD.shtml

相关文章

JavaWeb JSP内置对象之session对象

4、session对象 在WEB应用中&#xff0c;当一个客户首次访问服务器上的某个jsp页面时&#xff0c;jsp引擎&#xff08;比如TOMCAT&#xff09;将为这个客户创建一个session对象&#xff0c;当客户关闭浏览器离开之后&#xff0c;session对象被注销。 设置session的目的是为了服…

jsp内置对象之session对象

在WEB应用中&#xff0c;当一个客户首次访问服务器上的某个jsp页面时&#xff0c;jsp引擎&#xff08;比如TOMCAT&#xff09;将为这个客户创建一个session对象&#xff0c;当客户关闭浏览器离开之后&#xff0c;session对象被注销。 设置session的目的是为了服务器端识别客户。…

JAVA Web入门之JSP内置对象的解析及使用(超详细必看)

创作不易 觉得有帮助请点赞关注收藏~~ 概述&#xff1a;由于JSP使用java作为脚本语言 所以JSP具有强大的对象处理能力 并且可以动态创建web页面内容 但java语言在使用一个对象前 需要先实例化这个对象 为了简化开发 JSP提供了一些内置对象 用来实现JSP应用 在使用JSP内置对象…

JSP内置对象和四大作用域

一、JSP九大内置对象 名称 类型 含义 获取方式 request HttpSevletRequest 封装所有请求信息 方法参数 response HttpServletResponse 封装所有响应信息 方法参数 session HttpSession 封装所有会话信息 req.getSession() application ServletContext 所有信…

jsp内置对象的作用范围

内置对象的作用范围是指每个内置对象的某个实例在多长时间和多大的范围中有效&#xff0c;即在什么样的范围内可以有效地访问同一个对象实例。 在javax.servlet.jsp.PageContext的类中定义了4个常量来指定内置对象的作用范围&#xff1a;APPLICATION_SCOPE、SESSION_SCOPE、PAG…

JSP内置对象——application对象

在介绍appl ication 对象之前&#xff0c;先简单介绍一些Web 服务器的实现原理。 对于大部分浏览器而言&#xff0c;它通常负责完成三件事情&#xff1a; &#xff08;1&#xff09;向远程服务器发送请求。 &#xff08;2&#xff09;读取远程服务器返回的字符串数据。 &#x…

JSP入门之JSP内置对象

系列文章目录 目录 前言 一、request对象 1.获取用户提交的信息 2.JSP页面文件的编码方式 3.常用方法举例 4.处理HTML标记 5.处理超链接 二、response对象 1.动态响应contentType属性 2.response对象的HTTP文件头 3.response对象的重定向 三、session对象 1.se…

JSP内置对象request

1.request对象 request对象是最常用的JSP内置对象之一,其中包含了有关浏览器请求的信息 可以在JSP页面中通过调用request对象的方法来获取请求中的相关数据以及浏览器的有关信息。 request对象用于处理请求的方法有很多 request的getPaeameter&#xff08;&#xff09;方法是…

【Jsp】第七课 Jsp内置对象的学习和使用

概念 什么是JSP内置对象&#xff1f; } JSP 内置对象是 Web 容器创建的一组对象 } JSP 内置对象是可以直接在 JSP 页面使用的对象 &#xff0c;无需使用“ new” 获取实例 } JSP 内置对象的名称是 JSP 的保留字 } 内置对象说白了就是别人创建好了的对象&#xff0c;我们…

JSP内置对象详解 常用方法

目录 out request response session application exception page config pageContext JSP内置对象的作用域 JSP内置对象是在JSP运行环境中已定义好的对象&#xff0c;可在JSP页面的脚本部分直接使用。 out对象 out 为输出流对象&#xff0c;主要用于向客户端输出流…

JSP内置对象

JSP内置对象的分类内置对象属性保存范围JSP内置对象的常用方法&#xff08;只列了一些&#xff09;小例子 一&#xff1a;JSP内置对象的分类 这些对象不用经过显示声明直接引用&#xff0c;也不用代码创建其实例&#xff0c;可在程序中直接使用&#xff0c;由Web Container为对…

jsp内置对象之request

一、内置对象概述 有些对象不用声明即可在jsp页面的java程序片和表达式中使用&#xff0c;这就是jsp 的内置对象。Jsp的常用的内置对象有request&#xff0c;response&#xff0c;session&#xff0c;aplication和out。Response和request对象是jsp内置对象中比较重要的两个&am…

JSP的内置对象详解

JSP内置对象 文章目录 JSP内置对象前言一、out对象1.原理2. 向客户端输出数据 二、page对象1.范围 三、pageContext 对象1.获取内置对象2.存储数据 四、request对象1.创建及获取请求2.范围 五、response 对象1.重定向网页2.处理HTTP文件头 六、session对象1.创建及获取客户的会…

JSP常用内置对象概述

1、概述 JSP提供了9个预设的对象&#xff0c;我们将其称为内置对象。这些对象内置在JSP网页环境之下&#xff0c;因此用户不需要引用这些对象所属的包&#xff0c;便可以直接在JSP网页中使用这些对象。 如图&#xff1a; (1 ) request与response对象。JSP网页能够具备与用户…

JSP的九种内置对象

JSP有九个内置对象&#xff08;又叫隐含对象&#xff09;&#xff0c;不需要预先声明就可以在脚本代码和表达式中随意使用&#xff0c;即不需要实例化&#xff0c;直接使用其方法即可。 pageppagecontentoutconfigexceptionrequestreponsesessionapplication 作用域&#xff…

JSP九大内置对象

JSP提供了由容器实现和管理的内置对象&#xff0c;也可以称之为隐含对象&#xff0c;由于JSP使用Java作为脚本语言&#xff0c;所以JSP将具有强大的对象处理能力&#xff0c;并且可以动态创建Web页面内容。但Java语法在使用一个对象前&#xff0c;需要先实例化这个对象&#xf…

【JSP内置对象】之9大内置对象(JavaWeb必背必掌握)

JSP内置对象 理解9大内置对象分类1.request&#xff08;请求对象&#xff09;2.response(响应对象)3.session(会话对象)4.application(应用程序对象)5.page(页面对象)6.pageContext(页面上下文对象)7.out(输出对象)8.config(配置对象)9.exception(异常对象) 理解 1.JavaEE规范…

SQL INSERT 语句

INSERT 语句是向表中添加新行&#xff0c;&#xff08;如图所示的是INSERT 语句的最基本形式&#xff09; 1、首先&#xff0c;是要指定要插入的表的名称&#xff08;例如图中的yuangong&#xff09; 2、其次&#xff0c;指定要插入的数据&#xff0c;一个或多个列的列表。必须…

pycharm sql语句插入

一. 二. 开控制台 三. 书写sql语句&#xff0c;点击绿色三角运行

python执行sql 语句

python执行sql 语句 数据etl 过程中会涉及到调度&#xff0c;也就是每天要定时执行的任务&#xff0c;这些任务执行过程中其实是通过底层的脚本代码来进行数据的清洗转换等处理的。而脚本代码中肯定会涉及到调用sql 语句的情况&#xff0c;最近项目正好用到python 脚本调用sql…