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 \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.mfbz.cn/a/604254.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第一天复习Qt文件读取

Qt文件操作: 1、QFile QTextStream操作文件案例: 1、打开文件 QFile file(absolute filepath | relative path); file.readLine()返回内容长度,如果为-1就是读取失败 file. Close()读取后关闭 file.errorString()返回文件打开发生的错误2、…

如何购买阿里云99计划的ECS云服务器?99元购买阿里云2核2G3M服务器教程

阿里云助力中小企业和开发者无忧上云的“99计划”中有两款性价比超高的ECS云服务器,2026年3月31日活动结束前新购和续费价格一样。 其中个人和企业新老用户同享的2核2G3M服务器仅需99元/年(续费同价),企业新老用户同学的2核4G5M仅…

外贸企业6大客户开发渠道优缺点全面解析 | 箱讯科技国际贸易综合服务平台

一、展会的重要性 展会,作为历史悠久的客户开发渠道,一直备受企业推崇。它汇聚了来自不同行业的企业,为大家提供了一个集中展示产品和技术的大舞台。在没有互联网的年代,展会几乎成为外贸交易的核心媒介。至今,它依然…

射频无源器件之巴伦

一. 巴伦的作用 Balun,balanced-unbalanced的缩写,即平衡-不平衡转换器,是一种三端口无源器件,其本质是通过电感线圈的相互耦合实现的信号转换。用于平衡信号(差分信号,即振幅相等、相位相差180 的两个信号)与非平衡信号(单端信号)的相互转换。 Balun是高频电路重要器…

《编译原理》阅读笔记:p1-p3

《编译原理》学习第 1 天,p1-p3总结,总计 3 页。 一、技术总结 1.compiler(编译器) p1, But, before a program can be run, it first must be translated into a form in which it can be executed by a computer. The software systems that do thi…

水面垃圾清理机器人的视觉算法研究

卷积神经网络是一种分层的数据表示模型,通常由数据输入层、卷积层、池化层、 非线性激活函数、全连接层以及输出结果预测层等组成,其中卷积层、池化层和非线 性激活函数是卷积神经网络中的重要组成部分。此外,有些模型会增加其他的层(归一 化…

16.接口自动化学习-编码处理与装饰器

1.编码和解码 编码:将自然语言翻译成计算机可以识别的语言 hello–01010 解码:将机器识别的语言翻译成自然语言 2.编码格式 UTF-8 GBK unicode 3.编码操作 #编码操作str1"hello呀哈哈哈"str2str1.encode(gbk)print(str2)print(type(str2))…

面试笔记——多线程使用场景

线程池使用场景(CountDownLatch, Future) CountDownLatch CountDownLatch(闭锁/倒计时锁)用来进行线程同步协作,等待所有线程完成倒计时(一个或者多个线程,等待其他多个线程完成某件…

漏扫神器Invicti V2024.4.0专业版

前言 Invicti Professional是Invicti Security公司推出的一个产品,它是一种高级的网络安全扫描工具。Invicti Professional旨在帮助组织发现和修复其网络系统中的潜在安全漏洞和弱点。它提供了全面的漏洞扫描功能,包括Web应用程序和网络基础设施的漏洞扫…

2024 GESP6级 编程第一题 游戏

题目描述 你有四个正整数 ,并准备用它们玩一个简单的小游戏。 在一轮游戏操作中,你可以选择将 减去 ,或是将 减去 。游戏将会进行多轮操作,直到当 时游戏结束。 你想知道游戏结束时有多少种不同的游戏操作序列。两种游戏操作…

[微信小程序] 入门笔记1-滚动视图组件

[微信小程序] 入门笔记1-滚动视图组件 1.页面&组件&渲染 在小程序是由一个个页面page组成, 而页面又是由一个个组件component组成.和网页类似,这里的组件指的就是输入框<input>,按钮<button>,文本<text>,图片<image>等元素.如果你学过网页一…

;【排列【

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

ethercat :推荐一个不错的ethercat主从站开源项目

一、引言 最近在研究EtherCAT,也极有兴趣想要搞通整个底层协议&#xff0c;将来有机会搞自己的软件EtherCAT产品。这里推荐一个不错的开源项目&#xff0c;与志同道合的朋友共同学习。 Ethercat-master 主站地址&#xff1a;https://github.com/OpenEtherCATsociety/SOEM Eth…

记一次DNS故障导致用户无法充值的问题(上)

背景&#xff1a; 刚刚过去了五一劳动节&#xff0c;回来后一上班接到客服运营团队反馈的节日期间的问题&#xff0c;反馈有部分用户无法充值。拿到的反馈资料有&#xff1a; 无法充值操作视频、问题时间、手机机型、手机网络情况。 1、从视频中看到用户点击支付后没有任何反…

DRF视图基类使用方法

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

[附源码]秦时明月6.2魔改版_搭建架设教程_附GM工具_安卓苹果

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 一. 演示视频 秦时明…

stack的使用

1.栈的定义 我们可以看到模板参数里面有一个容器适配器 &#xff0c;什么是适配器&#xff1f;比如充电器就叫做电源适配器&#xff0c;用在做转换&#xff0c;对电压进行相关的转换适配我们的设备。栈&#xff0c;队列不是自己直接管理数据&#xff0c;是让其他容器管理数据&a…

缓存雪崩、击穿、击穿

缓存雪崩&#xff1a; 就是大量数据在同一时间过期或者redis宕机时&#xff0c;这时候有大量的用户请求无法在redis中进行处理&#xff0c;而去直接访问数据库&#xff0c;从而导致数据库压力剧增&#xff0c;甚至有可能导致数据库宕机&#xff0c;从而引发的一些列连锁反应&a…

【linux】进程概念|task_struct|getpid|getppid

目录 ​编辑 1.进程的概念 进程的基本概念 进程与程序的主要区别 进程的特征 进程的状态 描述进程—PCB task_struct中的内容 查看进程 1.创建一个进程&#xff0c;运行以下代码 通过系统调用获取进程标示符 getpid()以及getppid() 1.进程的概念 进程的基本概念…

JRT失控处理打印和演示

基于JRT完备的脚本化和打印基础&#xff0c;基于JRT的业务可以轻松的实现想要的打效果&#xff0c;这次以质控图的失控处理打印和月报打印来分享基于JRT的打印业务实现。 演示视频链接 失控报告打印 失控处理打印的虚拟M import JRT.Core.DataGrid.GridDto; import JRT.Co…
最新文章