原在我的 Github 上,欢迎订阅。

其他文章:

前言

外键约束是mysql提供的表与表之间的关联,使用它可以保证数据的一致性和完整性。

但是我问过同事,他们现在开发中不会使用外键约束,主要原因是数据量大或请求很频繁时会导致一些性能问题,实际开发中是通过业务代码来代替外键约束的功能。

但这不代表不需要学它,如果你的项目数据量不是很大,用外键约束还是非常方便的。

什么是外键

通过之前学习和练习,外键其实已经出现过,比如在student表中:

学生表中包含一个class_id,它指向class(班级表)的id,于是我们可以通过class_id来查找这个学生的班级信息。

此时,对于student表来说class_id就是它的外键,外键字面意思就是指向外部的某个键,这里就是指向外部class表的id

外键约束

多了“约束”两个字。 有约束代表着不能对含有外键关联的表随意删除和修改了,举个例子:

学生表 和 班级表 相互关联并有约束条件,如果有一天,你要删除某个班级,那班级里的学生怎么办呢?默认数据库会不让你删,因为班里还有学生存在。

OK,我们实际操作一把,现在把学生表和班级表加个外键约束:

ALTER TABLE student ADD CONSTRAINT student_class FOREIGN KEY (class_id) REFERENCES class(id);

解析一下上面的语句:

ALTER TABLE student :对 student 表进行操作

ADD CONSTRAINT student_class:添加约束,名称为 student_class

FOREIGN KEY (class_id):指定外键是 class_id

REFERENCES class(id):关联(参考) class 表的 id

看下结果:

为了好理解再看下 ER 图:

ON DELETE 和 ON UPDATE

ON DELETE 和 ON UPDATE 表示删除时 和 更新时 要处理的方式。

上面图里有删除时和更新时,这是数据删除和更新时的处理方式:

NO ACTION 或 RESTRICT:对父表删除或更新时,必须把子表处理完才能删除或更新主表数据

CASCADE:对父表删除或更新时,子表同时删除或更新

SET NULL:对父表删除或更新时,子表设置为NULL

默认为 RESTRICT 。

NO ACTION 或 RESTRICT

来看下设置为 NO ACTION 或 RESTRICT 时,我们删除和更新数据试试:

id=1 的班级表中有对应的学生,我们来删除这个班级:

DELETE FROM class WHERE id=1;

更新也是一样:

UPDATE class SET id=10 WHERE id=1;

CASCADE

CASCADE: 对父表删除或更新时,子表同时删除或更新

我们来试一把。

先修改外键约束:

ALTER TABLE student DROP FOREIGN KEY student_class;

ALTER TABLE student ADD

CONSTRAINT student_class

FOREIGN KEY (class_id)

REFERENCES class(id)

ON DELETE CASCADE

ON UPDATE CASCADE;

可以看到已经改为CASCADE了。

需要注意的是,要先删除外键约束 然后再重新生成。

现在我们来删除id=2的班级:

DELETE FROM class WHERE id=2;

然后来看看班级和学生:

班级表中 id=2 的数据已经没有了

再看看学生表:

class_id=2 的学生也一起删了

现在修改一下试试,我们把id=1 的班级修改为 id=10:

UPDATE class SET id=10 WHERE id=1;

修改成功:

再看看原本class_id=1的学生怎么样了:

class_id 也变成 10 了

SET NULL

SET NULL:对父表删除或更新时,子表设置为NULL

先把外键约束改成 SET NULL 的处理方式:

ALTER TABLE student DROP FOREIGN KEY student_class;

ALTER TABLE student

ADD CONSTRAINT student_class

FOREIGN KEY (class_id)

REFERENCES class(id)

ON DELETE SET NULL

ON UPDATE SET NULL;

为了演示方便,在student表中添加一条数据:

现在我们删除 id=3 的班级:

id=3的班级已经被删除,再看看 class_id=3 的学生怎么样了:

从图中看到,由于class_id=3这个班级被删除,这个班里的学生没有了班级,所以class_id为NULL了。

我们再看下更新:

UPDATE class SET id=100 WHERE id=10;

上面语句是把id=10的班级改为id=100:

班级修改成功了,再看看这个班级下的学生:

原本 class_id=10 的学生现在也没有了班级,class_id 也置为 NULL 了。

总结

本篇学习了什么是外键约束,以及外键约束的几个处理方式:

NO ACTION 或 RESTRICT:对父表删除或更新时,必须把子表处理完才能删除或更新主表数据

CASCADE:对父表删除或更新时,子表同时删除或更新

SET NULL:对父表删除或更新时,子表设置为NULL

默认为 RESTRICT 。

mysql 5个约束条件,Mysql入门第五课《外键约束》相关推荐

  1. C# 编程入门第五课,VS2019程序调试,for循环,水仙花数,Console.Write,又一种类型变换,三元表达式,产生随机数

    C# 编程入门第五课 文章目录 C# 编程入门第五课 1. VS2019程序调试 2. for循环 3. 水仙花数 4. Console.Write() 5. 又一种类型变换 6. 三元表达式 7.产 ...

  2. 打开程序时固定位置_新手入门第五课:免费开源图像处理程序GIMP之矩形选择工具...

    GIMP是一款图像处理软件,是跟Photoshop同一类型的软件,为了方便介绍,后面每篇相关GIMP图像处理软件的介绍文章的开头,我都将插入一段文字,用于介绍GIMP是什么,让不熟悉的朋友知道这是干什 ...

  3. 以二进制输出64位类型的数据_Java入门第五课:Java基本数据类型与变量的声明...

    数据类型 基本数据类型 Java有八种基本类型.六种数字类型(四个整数型(默认是int 型),两个浮点型(默认是double 型)),一种字符类型,一种布尔型. Byte.short.int.long ...

  4. Spring入门第五课

    集合属性 在Spring中可以通过一组内置的xml标签(如:<list>,<set>,<map>)来配置集合属性. 配置java.util.List类型的属性,需要 ...

  5. 数独基本规则_思维训练|数独入门第五课:唯余解法

    大家好,我们每周一次的数独课又来了. 本期,我们会介绍唯余解法: 唯余解法的原理十分简单,但是在实际的解题中,非常不容易辨认. 由于唯余解非常不容易辨认,所以一般的报章杂志及较大众化的数独网站,通常会 ...

  6. 八边形点坐标数的lisp_图形学入门第五课:齐次坐标

    齐次坐标(Homegeneous Coordinates) 在学习齐次坐标之前,我们要先好奇的问一下,为什么要学习齐次坐标.上一节课,我们学习了变换的三种基本形式:旋转,缩放,和切变.但是还有一种特殊 ...

  7. 【Java】_2_Java程序入门第五课

    我们知道,在C程序中,主入口函数(通常大家叫主函数,就是main()函数)可以获取系统传递给程序的参数,其主函数的定义形式如下: #include <stdio.h>int main(in ...

  8. Flash鼠绘入门第五课:绘制可口的樱桃-Flash鼠绘可口的樱桃(1)

    本课教学内容:Flash鼠绘水果 本课教学目的:进一步了解和掌握工具的使用方法,熟悉渐变色的使用及一些菜单下功能的运用. 在日常生活中,人们都离不开水果,而且对它们有一种特殊的喜爱和需要.那么,我们就 ...

  9. python符号运算_入门第五课 Python运算符号

    准确地讲,应该叫"运算符",运算符号是我为了方便大家理解起的名字. 在数学中,我们有很多熟悉常用的运算符号:加号+.减号-.乘号(Python中的乘号是*).除号(Python的除 ...

  10. (19)一篇掌握MySQL数据库基础下 基本操作(外键约束、建表原则、多表查询、子查询)

    MySQL数据库基础下 一.修改表--添加外键约束 二.多表之间的建表原则 1.建数据库原则:通常情况下,一个项目/应用建一个数据库 2.多表之间的表原则: (1)一对多:分类和商品 (一个分类对应多 ...

最新文章

  1. 宁波工程学院2020新生校赛(重现赛)部分题解
  2. 为什么说混合云是新基建的流行架构?文末彩蛋!
  3. 基于Springboot实现企业人事管理系统
  4. 初步了解Linux strace 命令和跟踪进程产生的系统调用
  5. 万物互联、应用现代化、云原生新范式,华为云为数字化转型提供最优解
  6. Python要点总结,我使用了100个小例子!
  7. μC/OS-III---I笔记3---时间管理
  8. 「Leetcode」242. 有效的字母异位词:可以拿数组当哈希表来用,但哈希值不要太大!
  9. 整流五 - PWM整流器无差拍控制 一(重复控制算法)
  10. eclipse java1.8_不同版本Eclipse对JDK版本要求
  11. 字节跳动启动大规模校招
  12. Scroller类源码解析及其应用(一)
  13. java自动违例设计,如何在Java中创建自己的违例
  14. 转载 loadrunner的一些问题解决
  15. 网站如何诊断,完整的网站诊断方法!
  16. 苹果手机左上角的数字怎么弄_出了新朋友,莫忘老朋友,苹果Macbook这款小键盘能让你键步如飞...
  17. 单个应用流量统计实现和核对
  18. selenium基础知识大全(转)
  19. 手持两把锟斤拷,口中疾呼烫烫烫。 脚踏千朵屯屯屯,笑看万物锘锘锘。
  20. SQL Server 2008 r2 bpa 安装

热门文章

  1. 深入理解jQuery中的事件冒泡
  2. android荧光进度条,Android ProgressBar 进度条荧光效果
  3. 汉诺塔c++_C语言,递归解决汉诺塔问题
  4. Python中.mat文件的读写操作
  5. 图片上传经过jwt_SpringSecurity整合Jwt过程图解
  6. android runtime异常,在做android下拉刷新时遇到异常java.lang.RuntimeException: Can't create handle...
  7. python脚本画pie饼图_小白学Python(11)——pyecharts,绘制饼图 Pie
  8. Python(十九):比较、深浅拷贝
  9. C语言文件读写操作中缓冲区问题和setbuf函数详解
  10. python 多行字符串缩进_Python多行字符串的正确缩进