外键约束:foreign key
*外键 foreign key*
1、概念:如果一个实体的(student)的某个字段,指向(引用)另个实体(class)的主键
(class:class_id),就称为student实体的class_id是 外键 。
【声名】被指向的实体,称之为主实体(主表),也叫父实体(父表)。class
负责指向的实体,称之为从实体(从表),也叫子实体(子表)。student
作用:用于约束处于关系内的实体。
比如说:我们去一家很火的餐厅吃饭,去餐厅之前我们是在网上预约了位置的客户,与此同时也刚好来了另外一桌未预约的客户,当餐厅恰好空出一个用餐位置。此时餐厅应该先安排在预约名单中客户,而不是未预约的客户。这就是一种约束关系。(例子举得不太好,大佬们见谅哈)
两大限制:
1)增加子表记录时,是否有之对应的父表记录。如果有,则数据插入成功;否则,数据插入失败。
2)在删除或者更新主表记录时,从表应该如何处理相关的记录。
2、定义外键:
在从表上,增加一个 外键字段,指向主表的主键。使用关键字 foreign key
语法:foreign key ([从表]外键字段) 主表名 (关联字段)
3、例子解释
#表一:学生信息表(主表)
CREATE TABLE stu_info (
id int(10) primary key auto_increment,
name varchar(10) not null,
sex varchar(10),
birth varchar(15)) character set utf8;
#表二:学生成绩表(从表)
CREATE TABLE stu_marks (
id int(10) primary key auto_increment,
CHINESE int (3),
MATH int (3),
ENGLISH int (3),
foreign key (id) references stu_info (id)) character set utf8; #设置外键约束,foreign key ([从表]外键字段) 主表名 (关联字段)。
【解析】:
设置“外键约束”后的作用,相当于事先建立了一个库,当从表需要插入数据时只能插入 被约束的值,也就是 库 中已经存在的值。
比如我们这边的例子是设置 外键约束 是 id,所以我们在给从表 插入数据时就会有约束,从表 的id值必须是在 主表 中已经存在的,否则报错。
【报错例子】:
报错原因:
我们给学生成绩表(从表)插入信息时,由于学生信息表(主表)中不存在 id=2016888888 的学生信息,所以插入信息失败。
4、删除操作:
4.1 删除 ‘从表’ 中的数据:不会影响 主表 的数据
例子:delete from stu_marks where id=2016030638;
、
4.2删除 ‘主表’ 中的数据:
例子:delete from stu_info where id=2015020314;
解析:由于开启了外键约束,会检查外键约束,所以我们无法“删除”或者“更新”主表 stu_info中的数据。
4.2.3删除/更新 ‘主表’ 中的数据方法:
1)关闭外键约束检查:set foreign_key_checks=0;
4.2.4禁止删除/更新 ‘主表’ 中的数据:
1)打开外键约束检查:set foreign_key_checks=1;
外键约束:foreign key的更多相关文章
- MySQL系列(十一)--外键约束foreign key的基本使用
有些时候,为了保证数据的完整性,我们会选择的使用外键约束,例如教师对应的表和课程表中老师的id,这种时候就要使用外键约束了. PS:这里不考虑表结构设计,三范式与反范式等设计问题,基于MySQL8.0 ...
- 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK
如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...
- 外键约束 foreign key
外键约束 :保持数据一致性,完整性实现一对多关系.外键必须关联到键上面去,一般情况是,关联到另一张表的主键 (因为一个表只存一类信息.用外键来做参照,保证数据的一致性,可以减少数据冗余) ##表acr ...
- mysql 外键(FOREIGN KEY)
最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...
- MySQL(10):实体、实体表和外键(foreign key)
1.实体 数据库管理系统中的各种用于数据管理方便而设定的各种数据管理对象,如:数据库表.视图.存储过程等都是数据库实体.广义上讲,这些对象中所存储的数据也是数据库实体.因为它们也是确切存 ...
- SQL 语句外键 a foreign key constraint fails
queryRunner.update("SET FOREIGN_KEY_CHECKS = 0;"); queryRunner.update(sql, pid); queryRunn ...
- 关系型数据库中主键(primary key)和外键(foreign key)的概念。
刚接触关系型数据库的同学,会听过主键和外键的概念.这是关系型数据库的基本概念,需要清楚理解.今天我就以简洁的语言总结一下这个概念. 主键.一句话概括:一张表中,可以用于唯一标识一条记录的字段组(或者说 ...
- 数据库 SQL 外键约束 多表查询
多表设计与多表查询 1.外键约束 表是用来保存现实生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来 ...
- 详解MariaDB数据库的外键约束
1.什么是外键约束 外键约束(foreign key)就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强. 关于数据表的完整性和关连性,可以举个例子 ...
- 约束Constraints--主键约束、外键约束、唯一约束、检查约束、默认约束、NOT NULL约束、列约束与表约束、创建约束、删除约束
约束 Including Constraints 以下内容转自:https://www.cnblogs.com/wcl2017/p/7043939.html和http://blog.csdn.ne ...
随机推荐
- K3/Cloud 执行计划任务错误排查
计划任务的不执行原因可能有: 1.K3CloudJobProcess服务处于停止状态. 2.数据中心未勾选“允许执行计划任务”. 这种情况此数据中心下的所有计划任务都不会执行到. 3.第一次加进计划任 ...
- 机器学习作业(七)非监督学习——Matlab实现
题目下载[传送门] 第1题 简述:实现K-means聚类,并应用到图像压缩上. 第1步:实现kMeansInitCentroids函数,初始化聚类中心: function centroids = kM ...
- Linux安装Tomcat,解决不能访问Manager App
在Windows环境中安装Tomcat时,只需要在Tomcat目录下/conf/tomcat-user.xml文件增加用户就可以了.在Linux系统中添加了username还是不能访问. 一.Li ...
- wget安装nginx
#下载: wget http://nginx.org/download/nginx-1.8.0.tar.gz #解压: tar -zxvf nginx-1.8.0.tar.gz #安装依赖插件 yum ...
- Python内置方法/函数
abs() 返回数字的绝对值. abs(x) all() 用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False. 元素除了是 0.空. ...
- maven打包忽略test文件夹
当在项目中的test中写了单元测试后,在mvn install打包时会自动进行所有单元测试,所以这时需要忽略test文件夹 有两种方法: 1.用命令的方式:mvn install -Dmaven.te ...
- 2019-08-10 纪中NOIP模拟B组
T1 [JZOJ1235] 洪水 题目描述 一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的. 森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示 ...
- arm-linux-gcc
搭建交叉编译环境,即安装.配置交叉编译工具链.在Ubuntu环境下编译出嵌入式Linux系统所需的操作系统.应用程序等,然后再上传到目标机上. 交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构 ...
- C#中字节数组byte[]和字符串string类型的相互转换
C#中字节数组byte[]和字符串string类型的相互转换: string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBy ...
- 安装MySQL5.7.22遇到的坑
安装MySQL: 第一步:将压缩包解压后,手动新建名为my.ini的文本文档,代码内容如下: #代码开始[mysql]default-character-set=utf8[mysqld]#skip-g ...