当前位置: 首页 > news >正文

MySQL - 外键(foreign key)约束的作用和使用

什么是外键约束?

外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

外键约束是用于建立两个表之间关系的一种约束,它定义了一个表中的列与另一个表中的列之间的关系。外键约束可以保证数据的完整性和一致性,确保表与表之间的关系得到正确维护

外键约束的使用方法

基本语法:

-- 创建表时添加外键
create table 表名(
字段名 数据类型,
...
[constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)
);-- 单独添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名)
references 主表 (主表列名) ;-- 删除外键
alter table 表名 drop foreign key 外键名称;

外键产生的行为(删除/更新行为)

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:

行为说明
no action当在父表(主表)中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 RESTRICT 一致) 默认行为
restrict当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不
允许删除/更新。 (与 NO ACTION 一致) 默认行为
cascade当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则
也删除/更新外键在子表中的记录。
set null当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表
中该外键值为null(这就要求该外键允许取null)。
set default父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持)

可以添加行为:

-- 设置update和delete为cascade行为
alter table 表名 add constraint 外键名称 foreign key (外键字段) references 
主表名 (主表字段名) on update cascade on delete cascade;

实例介绍

假设有两个表: students (学生表)和 courses (课程表)。每个学生可以选择多门课程,因此我们希望通过外键约束来确保学生表中的 course_id 列与课程表中的 course_id 列保持一致。

1. 数据完整性:通过外键约束,我们可以确保学生表中的 course_id 列只引用了课程表中存在的有效 course_id 值。这样可以防止无效的或不存在的课程ID被插入到学生表中,保证数据的完整性。

2. 数据一致性:外键约束可以确保学生表中的 course_id 列与课程表中的 course_id 列保持一致。如果在课程表中更新或删除了某门课程的记录,外键约束会自动处理相关的学生表中的数据,以保持数据的一致性。

3. 数据查询和关联:使用外键约束可以简化数据查询和关联操作。通过外键关联,我们可以轻松地从学生表中获取与特定课程相关的学生信息,或者从课程表中获取与特定学生相关的课程信息。

注意事项

1. 外键约束只能在InnoDB存储引擎下使用,因此需要确保表使用的是InnoDB引擎。

2. 外键列和主键列的数据类型和长度必须相同,否则无法建立外键约束。

3. 当删除或更新主表中的数据时,需要谨慎选择ON DELETE和ON UPDATE子句,以确保从表中的数据处理方式符合业务需求。

4. 外键约束可能会影响数据库的性能,特别是在大量数据插入或更新时。因此,在设计数据库时,需要权衡使用外键约束的必要性和性能影响。

上一篇:MySQL - 关于约束类型和作用的介绍

下一篇:MySQL 多表关系(多表查询 一)

http://www.lryc.cn/news/178172.html

相关文章:

  • 前端开发之服务器的基本概念与初识Ajax
  • 数据结构排序算法---八大排序复杂度及代码实现
  • GMS之Launcher中去除默认Search或替换为Chrome Search
  • @DateTimeFormat 和 @JsonFormat 的详细研究
  • nodejs基于Vue.js健身体育器材用品商城购物网97794
  • C#WPF框架Microsoft.Toolkit.MvvM应用实例
  • 蓝桥杯每日一题2023.9.27
  • Redis与分布式-主从复制
  • QT pyside2 线程嵌套子线程 实现开始运行和停止运行
  • 江西广电会展集团总经理李悦一行莅临拓世科技集团调研参观,科技璀璨AIGC掀新潮
  • 【RabbitMQ实战】06 RabbitMQ配置
  • CTF 全讲解:[SWPUCTF 2021 新生赛]jicao
  • FL Studio21.1电脑试用体验版音乐制作软件
  • 【数据结构】单链表的基本操作(节点建立、插入删除)
  • DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。
  • 施耐德电气:勾勒未来工业愿景,赋能中国市场
  • 安防监控产品经营商城小程序的作用是什么
  • php中判断指定字符串是否包含指定字符的封装函数
  • GICI-LIB源码阅读(三)因子图优化模型
  • 5、Docker安装mysql主从复制与redis集群
  • 【AI视野·今日NLP 自然语言处理论文速览 第四十三期】Thu, 28 Sep 2023
  • Unity 制作登录功能01-创建登录的UI并获取输入内容
  • 什么是用户画像?
  • DevExpress WinForms图表组件 - 直观的数据信息呈现方式!(二)
  • 基于AIOps实现智慧园区极简IT运维
  • chatgpt 只会死记硬背吗
  • 03-Zookeeper客户端使用
  • 自然语言处理(NLP)学习之与HanLP的初相识
  • JDBC【DBUtils】
  • 大数据Doris(一):Doris概述篇