Mysql基础(五)外键约束

一  外键

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

①  思考

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 \Gsynax '语法':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 delete1. on delete cascade: 删除 A 表的数据时,对应 B 表的数据也会'极联删除'2. on delete set null:删除 A 表的数据时,对应 B 表的'外键字段'置为'空'备注: 前提是该字段可以为'空'如果添加外键时'没加上面内容',删除 A 表的数据时,如果对应 B 表有数据就会报错二、on update1. 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]、添加'新的外键',修改事件'触发限制'为 CASCADEALTER 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.hqwc.cn/news/679007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【3dmax笔记】027:配置修改器集、工具栏自定义与加载

文章目录 一、配置修改器集二、自定义工具栏三、加载工具栏 一、配置修改器集 可以把自己常用的修改命令放到右边框中的部分,便于自己的操作,省去了每次都要花半天时间找命令的尴尬。新建一个二维或者三维物体,点击修改面板,点击…

4.26.7具有超级令牌采样功能的 Vision Transformer

Vision Transformer在捕获浅层的局部特征时可能会受到高冗余的影响。 在神经网络的早期阶段获得高效且有效的全局上下文建模: ①从超像素的设计中汲取灵感,减少了后续处理中图像基元的数量,并将超级令牌引入到Vision Transformer中。 超像素…

(五)JSP教程——response对象

response对象主要用于动态响应客户端请求(request),然后将JSP处理后的结果返回给客户端浏览器。JSP容器根据客户端的请求建立一个默认的response对象,然后使用response对象动态地创建Web页面、改变HTTP标头、返回服务器端地状态码…

[iOS]从拾遗到Runtime(上)

[iOS]从拾遗到Runtime(上) 文章目录 [iOS]从拾遗到Runtime(上)写在前面名词介绍instance 实例对象class 类对象meta-class 元类对象为什么要有元类? runtimeMethod(objc_method)SEL(objc_selector)IMP 类缓存(objc_cache)Category(objc_category) 消息传递消息传递的…

【数字经济】上市公司供应链数字化数据(2000-2022)

数据来源: 时间跨度:2000-2022年 数据范围:各上市企业 数据指标: 样例数据: 参考文献:[1]刘海建,胡化广,张树山,等.供应链数字化的绿色创新效应[J].财经研究,2023,49(03):4-18. 下载链接:https:…

深度学习网络:设计、开发和部署

​书籍:Deep Learning Networks: Design, Development and Deployment 作者:Jayakumar Singaram,S. S. Iyengar,Azad M. Madni 出版:Springer书籍下载-《​深度学习网络:设计、开发和部署》该教材为学生和工…

无意的一次学习,竟让我摆脱了Android控制?

由于鸿蒙的爆火,为了赶上时代先锋。到目前为止也研究过很长一段时间。作为一名Android的研发人员,免不了对其评头论足,指导文档如何写才算专业?页面如何绘制?页面如何跳转?有没有四大组件等等。 而Harmony…

企业车辆管理系统参考论文(论文 + 源码)

【免费】关于企业车辆管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89282550 企业车辆管理系统 摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理…

VINS初始化原理及代码

文章目录 预备符号定义代码中常用的容器: 初始化原理及步骤初始化目的初始化原理初始化步骤 初始化详细流程、原理及代码。参考文献 预备 符号定义 ( ⋅ ) w \left(\cdot\right)^w (⋅)w表示世界坐标系下的表示,Z轴与重力方向重合。 ( ⋅ ) b \left(\c…

设置默认表空间和重命名

目录 设置默认表空间 创建的临时表空间 tspace4 修改为默认临时表空间 创建的永久性表空间 tspace3 修改为默认永久表空间 重命名表空间 将表空间 tspace3 修改为 tspace3_1 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/13520…

动态规划——路径问题:931.下降路径最小和

文章目录 题目描述算法原理1.状态表示(经验题目)2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接:931.下降路径最小和 关于这⼀类题,看过我之前的博客的朋友对于状态表示以及状态转移是⽐较容易分析…

【CSS】认识CSS选择器及各选择器对应的用法

目录 一、什么是CSS? 二、CSS 选择器 1. 标签选择器 2. 类选择器 3. ID选择器 4. 通配符选择器 5. 复合选择器 一、什么是CSS? CSS(Cascading Style Sheet),层叠样式表。它与 HTML(超文本标记语言)一起使用&am…