MySQL外键约束(Foreign Key)案例详解


Posted in MySQL onJune 28, 2022

今天继续给大家介绍MySQL相关知识,本文主要内容是MySQL外键约束详解。

一、MySQL外键约束作用

外键约束(Foreign Key)即数据库中两个数据表之间的某个列建立的一种联系。这种联系通常是以实际场景中含义完全相同的字段所造成的。MySQL通过外键约束的引入,可以使得数据表中的数据完整性更强,也更符合显示情况。下面,我举一个例子来说明MySQL外键约束的作用。

假如我们对大学学生成绩管理系统建立数据库,有两张表,一张表是学生表,存储了学生的学号、姓名、性别、院系等信息,还有一张表是成绩表,存储了学生学号、课程编号、考试成绩等信息。这样,这两张表之间就会通过学生学号建立外键约束。很自然的我们想到,成绩表的学生学号依赖于学生表的学生学号存在,如果一个学生毕业、或者退学,从学生表中删除时,那么他的相关成绩也就没有必要在成绩表中存在了。在没有创建外键关系之前,这两张表完全是独立存在的,我们可以强行在成绩表中插入一个不存在学生的相关成绩,也可以强行删除学生表中的一个学生,并且不管其成绩信息是否在成绩表中存在。但是,在建立外键关系后,MySQL数据库会约束上述两种行为,每次对数据进行插入或者删除时,都会检查数据完整性,使得我们的操作必须符合实际情况。

二、外键约束创建

(一)创建外键约束的条件

MySQL数据库外键的创建,需要满足以下四个条件,否则会被MySQL数据库拒绝:

1、创建外键的表和列存在

2、组成外键的列存在索引

3、必须指定数据表的引擎为InnoDB

4、外键字段和关联字段,数据类型必须一致

(二)在创建数据表时创建外键约束

在创建数据表时创建外键约束,只需要在创建数据表的create语句后面,使用foreign key关键字指定本表的外键字段,使用reference关键字指定关联表的关联字段,并且明确约束行为即可。

创建外键约束的SQL语句示例如下:

create table student (id int(8),name varchar(20),department varchar(20) ,index (id))ENGINE=InnoDB;
create table grade (Sid int(8),Cid int(10),score int,index(Sid),foreign key (Sid) references student(id) on  delete  restrict on update cascade)ENGINE=InnoDB;

在上述SQL语句中,on delete restrict 是指明在删除时外键会对该删除操作进行限制,而on update cascade是指名在更新时会对该更新操作进行同步。

(三)在创建数据表后添加外键约束

同样的,MySQL也支持在创建数据表后再添加外键约束。在上例中,我们先删除grade表,然后再创建grade表,现不创建外键,尝试在创建grade表后添加外键,相关SQL命令如下:

drop table grade;
create table grade(Sid int(8),Cid int(10),score int);
alter table grade add index(Sid);
alter table grade add foreign key (Sid) references student(id) on delete restrict on update cascade;

执行结果如下:

MySQL外键约束(Foreign Key)案例详解

三、外键约束功能演示

下面,我们就来测试一下外键约束的功能,首先,尝试向grade表插入一个不存在学生的成绩,发现被拒绝:

MySQL外键约束(Foreign Key)案例详解

之后,尝试删除student表中存在成绩的学生,发现被拒绝:

MySQL外键约束(Foreign Key)案例详解

紧接着,我们测试一下MySQL外键约束级联更新功能,发现,如果更改了student表中的数据,grade表也会跟着变动,如下所示:

MySQL外键约束(Foreign Key)案例详解

总结

到此这篇关于MySQL外键约束(Foreign Key)案例详解的文章就介绍到这了,更多相关MySQL外键约束内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
一篇文章弄懂MySQL查询语句的执行过程
May 07 MySQL
MySQL 使用自定义变量进行查询优化
May 14 MySQL
修改MySQL的数据库引擎为INNODB的方法
May 26 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
MySQL 8.0 驱动与阿里druid版本兼容问题解决
Jul 01 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
MySQL主从切换的超详细步骤
Jun 28 #MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 #MySQL
MySQL导致索引失效的几种情况
Jun 25 #MySQL
Mysql中的触发器定义及语法介绍
Jun 25 #MySQL
MySQL数据库配置信息查看与修改方法详解
Jun 25 #MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 #MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 #MySQL
You might like
基于PHP输出缓存(output_buffering)的深入理解
2013/06/13 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
Symfony2之session与cookie用法小结
2016/03/18 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
Django中使用Celery的方法示例
2018/11/29 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
财务会计毕业生自荐信
2013/11/02 职场文书
中学老师的自我评价
2013/11/07 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
上诉状格式
2015/05/23 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python