Mysql基础(五)外键约束

news2025/1/13 3:06:52

一  外键

激励: 每天进步'一点点'即可

①  思考

1、在MySQL中,我们知道'主键 PRIMARY KEY'的主要作用是'唯一'区分表中的各个'行 [记录]';

思考:但是对于'外键 foreign key'比较陌生?  那么外键'作用'以及'限制'条件和'目的'呢?

②  外键的定义

1、外键是'某个表 A'中的'一列 column',它包含在'另一个表 B'的'主键'中

2、外键也是'索引'的一种,是通过'一张表中的一列'指向'另一张表中的主键',来对两张表进行'关联'

3、一张表可以'有一个'外键,也可以存在'多个外键',与'多张表'进行关联

③  外键的定义

1、外键的'主要作用': 保证数据的'一致性'和'完整性',并且减少数据冗余

2、主要体现在以下'两个'方面:

  (1) 阻止执行

  从表'插入'新行,其'外键值'不是主表的主键值,便阻止插入

  从表'修改'外键值,新值不是主表的主键值便'阻止'修改

  主表'删除'行,其主键值'在从表里存在'便阻止删除(要想删除,必须'先删除从表'的相关行)

  主表'修改'主键值,旧值在'从表里存在'便阻止修改(要想修改,必须'先删除从表'的相关行)

 (2) '级联 cascade'执行

主表'删除'行,连带从表的相关行'一起删除'

主表'修改'主键值,连带从表相关行的'外键值'一起修改

遗留: 关于'主表'和'从表'的概念,一会'通过'案例讲解

思考: 什么是'外键约束'?

④  外键创建限制

1、'父表'必须'已经存在'于数据库中,或者是当前正在创建的表。

如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。

2、必须为'父表'定义'主键'

3、外键中'列的数目'必须和父表的主键中'列的数目'相同

4、两张表必须'是 InnoDB 表',MyISAM 表暂时'不支持'外键

备注: 并且它们'没有临时表'

5、外键列必须'建立了索引',MySQL 4.1.2+ 以后的版本在'建立外键时'会'自动'创建索引

6、外键关系的'两个表的列'必须是'数据类型相似',也就是可以'相互转换类型'的'列'

  比如: int 和tinyint 可以,而 int 和 char 则'不可以'

四种方式指定外键

⑤  外键创建1

1、在'已有的表'中增加'外键'

内容来源: help alter table \G

synax '语法':

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名)
REFERENCES 外表表名(主键字段名)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

重点: 'on delete' | 'on update' 的理解

通俗: 'A 表 [主表]'的 'id [主键]' 是 'B 表 [从表]' 外键

一、on delete

1. on delete cascade: 删除 A 表的数据时,对应 B 表的数据也会'极联删除'

2. on delete set null:删除 A 表的数据时,对应 B 表的'外键字段'置为'空'

   备注: 前提是该字段可以为'空'

如果添加外键时'没加上面内容',删除 A 表的数据时,如果对应 B 表有数据就会报错

二、on update

1. on update cascade: '更新' A 表数据的 id 时,对应 B 表的外键字段也会更新

2. on update set null:'更新' A 表数据的 id 时,对应 B 表的外键字段置为空

   备注: 前提是该字段可以为'空'

如果添加外键时'没加'上面内容,'更新 A 表的 id',如果对应 B 表有数据'就会报错'

三、添加'外键'语句

建表'以后'添加外键:

语法:alter table 表名称 add foreign key (列名称) references 关联表名称(列名称);

 alter table user add constraint '自定义约束名' foreign key (role_id) \

    references role(id) on delete cascade on update cascade;

⑥  外键创建2

1、在'创建表'时创建'外键'

  [1]、创建'主表'

CREATE TABLE student
(
	id int (11) primary key auto_increment,       //'主键'
	name char(255),
    sex char(255),
	age int(11)
) charset utf8;
 
  [2]、创建'从表'

CREATE TABLE student_score
(
	id int (11) primary key auto_increment,
	class char(255),
    score char(255),
	student_id int(11),                             //实际'外键'
    foreign	key (student_id) REFERENCES student(id) //从表'外键'与主表'主键'关联 
) charset utf8;

说明: 默认 'ENGINE=InnoDB'

2、查看'表结构'

SHOW CREATE TABLE student_score;

说明: 下面基于上述'主表和从表'验证外键作用

⑦  触发限制使用默认值 RESTRICT 的情况下

1、数据'初始化'  --> 注意'先后'顺序

  [1]、先向'主表'中添加'数据'

  [2]、再向'从表'中添加'数据'

现象: 数据'插入'正常,'无报错'、'警告'信息

说明: 以下'相关测试'是在说明'外键约束'

2、'从表' insert 插入'新行',外键值'不在'主表中,'被阻止'

INSERT INTO student_score (class, score, student_id) VALUES('语文', '100', 2);

通俗理解: 不能'引用'不存在的东西

现象: '从表'插入数据'报错'

错误: Cannot add or update a child row: a foreign key constraint fails

3、'从表' update 修改'外键值','新值'不是'主表的主键值',阻止修改

测试语句: UPDATE student_score SET student_id = 2 WHERE student_id = 1;

通俗理解: 不能'引用'不存在的东西

提示: 要想删除,必须'先删除从表'的'相关行'

现象: 修改'从表'数据'报错'

错误: Cannot add or update a child row: a foreign key constraint fails

4、主表 delete '删除行',其'主键值'在'从表'里,存在便阻止删除

通俗理解: 不能删除'还在引用'的东西

提示: 要想删除,必须'先删除'从表的'相关行'

5、主表 update 修改'主键值','旧值'在'从表'里存在,便'阻止'修改

通俗理解: 不能修改'还在引用'的东西

提示:要想'修改',必须'先删除从表'的'相关行[引用该旧值]'

⑧  更改事件触发限制CASCADE

1、'初始化'

  [1]、删除'旧的外键'

  ALTER TABLE 表名称 DROP FOREIGN KEY 外键名;
  
  [2]、添加'新的外键',修改事件'触发限制'为 CASCADE

  ALTER TABLE student_score 
  ADD CONSTRAINT s_id FOREIGN KEY (student_id) REFERENCES student (id) 
  ON DELETE CASCADE ON UPDATE CASCADE;

2、此时当'主表'修改'主键值','从表'中'相关行的外键值'将'一起级联修改'

3、如果'主表删除行',从表中的'相关行'将一起被删除

说明: 在'前面'的基础上继续操作

好处: 避免有'脏数据'残留

⑨  小结

事件触发'限制条件'的不同,会造成两张表中的'操作限制'不同

默认是: ON DELETE RESTRICT  ON UPDATE RESTRICT;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1654233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DRF视图基类使用方法

【 一 】drf之请求 请求对象Request 【 0 】前言 ​ 在 Python 中,通常通过 request 对象来处理 HTTP 请求,尤其是在 web 开发中,比如使用 Django、Flask 等框架时会经常接触到这个对象。request 对象是框架提供的,用于封装客户…

YOLOv5改进(二)BiFPN替换Neck网络

前言 针对红绿灯轻量化检测,上一节使用MobileNetv3替换了主干网络,本篇将在使用BiFPN替换Neck的方式优化算法~ 往期回顾 YOLOv5改进(一)MobileNetv3替换主干网络 目录 一、BiFPN简介二、改进方法一第一步:在common.…

实战28套JAVA高端架构P6/P7/P8架构—全栈架构

概述 Java SE Java SE(Java Platform,Standard Edition)。Java SE 以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。Java SE 包含了支持Java Web 服务开发的类,并为Java Platform&…

《从零开始,搭建一个简单的UVM验证平台》实操

最近的工作中需要用UVM平台去仿真软件同事写的C程序,虽然只要用EDA同事已经搭好的UVM平台稍微改改就行,但对于我这种从未接触过UVM甚至都没用过System Verilog的纯FPGA工程师来说还是很有难度的,因为我对这方面一点概念都没有。 基于此&…

批量网络装机

1. PXE概念 PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统。在启动过程中,…

【智能算法】雪消融优化算法(SAO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2023年,L Deng受到雪升华和融化行为启发,提出了雪消融优化算法(Snow Ablation Optimizer, SAO)。 2.算法原理 2.1算法思想 SAO模拟了雪的…

微信云小程序快速上手云数据库+云函数+云存储的操作

🚀 作者 :“二当家-小D” 🚀 博主简介:⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8年开发架构经验,精通java,擅长分布式高并发架构,自动化压力测试,微服务容器化k…

JSP技术讲解

目录 1、JSP简介 2、JSP体验 3、JSP运行原理 4、JSP基本语法 5、JSP指令 6、JSP内置九大对象 7、JSP标签 8、JSP配置 9、JSP排错 10、总结 在前面的Servlet学习中发现Servlet本质是一个java程序,因此Servlet更加擅长编写程序的业务逻辑,而如果要…

Java特性之设计模式【代理模式】

一、代理模式 概述 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口 主要解决: 在直接访问…

Apple强大功能:在新款 iPad Pro 和 iPad Air 中释放 M4 芯片潜力

Apple 的最新强大功能:在新款 iPad Pro 和 iPad Air 中释放 M4 芯片的潜力 概述 Apple 推出配备强大 M4 芯片的最新 iPad Pro 和 iPad Air 型号,再次突破创新界限。新一代 iPad 有望彻底改变我们的工作、创造和娱乐方式。凭借无与伦比的处理能力、令人惊…

CTF-reverse,逆向分析,对“左移4或右移4,即(x<<4) | (x >>4)的加密探讨

博主在刷题过程中遇上这样一个有意思的加密(如下图),苦苦思索其逆向运算,被硬控了很久,也没搜到什么资料来解释这个问题(也许是太简单??蒟蒻博主怀疑人生……) 经过博主不…

【MATLAB源码-第205期】基于matlab的LDPC译码算法仿真,对比BF算法,最小和算法,对数BP和概率BP四种算法。

操作环境: MATLAB 2022a 1、算法描述 LDPC 码简介 LDPC码是一种通过稀疏奇偶校验矩阵定义的线性分组码,1962年由Gallager首次提出。这种码具有高效的解码性能,尤其在接近香农极限的情况下,其性能表现尤为突出。LDPC码的核心特…

Logstash分析MySQL慢查询日志实践

删除匹配到的行,当前行信息不记录到message中

VMware Workstation 虚拟机学习 安装centos7.9

1打开VMware Workstation--文件--新建虚拟机 #选择对应的,本例选择最新的 2开始安装centos #网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITy…

Linux:进程通信(二)信号的保存

目录 一、信号的处理是否是立即处理的? 二、信号如何保存 1、阻塞、未决、递达 2、信号集 3、信号集操作函数 4、sigprocmask函数 5、sigpending 函数 上篇文章我们讲解了信号的产生:Linux:进程信号(一)信号的产…

【C语言】字符函数和字符串函数--超详解

前言: 在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。 1. 字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的&#…

实战BACnet/IP标准通信网关在楼宇自动化中的应用

智慧楼宇建设实现不同设备间的互联互通是一项巨大挑战,尤其是在那些历史悠久的建筑中,新旧系统并存的情况尤为普遍。某大型商业综合体就面临着这样的困境:老旧的暖通空调系统采用Modbus RTU协议,而新部署的能源管理系统却要求BACn…

一文搞懂MySQL索引的数据结构

一、引言 在数据库管理系统中,索引是提高查询性能的关键所在。对于MySQL这类关系型数据库来说,索引更是其优化查询不可或缺的一部分。索引能够大大加快数据的检索速度,减少数据库的I/O操作,提高数据库的整体性能。本文将从索引的…

第2章.STM32开发C语言常用知识点

目录 0. 《STM32单片机自学教程》专栏总纲 2.1. STM32嵌入式开发C语言编程的不同 2.2. C语言常用知识点 2.2.1 位操作 2.2.2 define 宏定义 2.2.3 条件编译 2.2.3.1 #ifdef 2.2.3.2 #ifndef 2.2.3.3 #if !defined 2.2.4 extern 变量声明 2.2.5 typedef 类型别名 …

PPP点对点协议

概述 Point-to-Point Protocol,点到点协议,工作于数据链路层,在链路层上传输网络层协议前验证链路的对端,主要用于在全双工的同异步链路上进行点到点的数据传输。 PPP主要是用来通过拨号或专线方式在两个网络节点之间建立连接、…