MySQL(10):实体、实体表和外键(foreign key)
1.实体
数据库管理系统中的各种用于数据管理方便而设定的各种数据管理对象,如:数据库表、视图、存储过程等都是数据库实体。广义上讲,这些对象中所存储的数据也是数据库实体。因为它们也是确切存在着的实体。
2.实体关系(表设计)
(1)1对1的关系:
两个实体表内,存在相同的主键字段;
如果记录的主键值等于另一个关系表内记录的主键值,则两条记录的对应为1对1 对应关系
下图示例:

这里本来这里的学生主信息表 和 学生详细信息表应该水平方向上连接起来,但是这里垂直分割了,这里在优化上称之为:垂直分割
通常一个表中的记录字段过多情况之下,我们通常都要拆分两个或者多个,分为常用信息表和不常用信息表;
只要这些拆分的多个表拥有统一的主键值ID,他们在逻辑上就是关联的。
(2)1对多的关系:
一个实体,对应多个其他实体,例如一个班级对应多个学生:
设计方案:
在多个那端(这里就是多个学生),增加一个字段(班级号),用于指向该实体所属的另外实体的标识;

(3)多对多的关系:
设计典型的利用一个中间表表示实体之间的对应关系。中间表的每一条记录表示一个关系。
可以分析:一个m:n可拆解为 1:m 1:n来实现:


3.外键 (foreign key)
(1) 概念:如果一个实体(itcast_student)的某个字段(student:class_id),指向(引用)另一个实体(itcast_class)的主键(class:class_id)
就称student实体的class_id是这两个实体关联的外键。

被指向的实体称为主实体(主表),也叫父实体(父表),这里就是itcast_class就是主表
负责指向的实体,称之为从实体(从表),也叫子实体(子表),这里就是itcast_student就是从表
(2)外键作用:
用于约束处于关系内的实体。
增加子表记录时,是否有与之对应的父表记录。
在删除或者更新主表记录时候,子表应该如何处理相关的记录。
(3)定义一个外键:
在从表上,增加一个外键字段,指向主表的主键。
使用关键字foreign key
语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) references 外表表名(对应的表的主键字段名);例: alter table tb_active add constraint FK_ID foreign key(user_id) references tb_user(id)







在主表数据发生改变时,与之关联的从表数据该如何变化:
主表更新
主表删除
使用关键字on update,on delete来标识
4.主表删除:on delete来标识
允许的级联操作:(主表数据发生改变的时候,对从表进行处理)
Cascade:关联操作,如果主表被删除,那么从表也会执行相关的操作
Set null : 设置为null表示从表不指向任何主表记录
Restrict :拒绝主表的相关操作
修改外键:先删除再新建外键,通过修改表来完成。
语法:
删除外键:Alter table tbl_name drop foreign key (class_id);
删除外键需要通过指定外键名称达到目的,可以通过在创建外键时,制定名称,或者使用MySQL默认生成的名称。
添加外键:Alter table tbl_name add foreign key ()
如下红色下划线部分是系统分配给itcast_student的外键名称:

下面我们通过实践理解上面内容:
(1)删除外键:

上面可见,我们已经删除外键成功,但是数据并没有删除,我们删除只是一条规则而已(外键),如下可见itcast_student中的数据没有删除:

(2)上面删除外键之后,我们再新建一个外键(为了增加级联操作):
mysql> alter table itcast_student add foreign key (class_id) references itcast_class (class_id) on delete set null;
on delete set null:表示删除时,将从表外键设置为null

(3)接下来我们删除数据,观察级联操作(set null):

(4)删除数据,观察级联操作(cascade):
首先我们重新维护一下数据(由于上面操作,使得数据改变,所以我们先维护一下数据,不然会找不到数据)
insert into itcast_class values (1,'php0331');
update itcast_student set class_id = 1 where stu_id = 2;


同样和上面之前一样,我们先删除外键,然后自己定义外键,只不过这里定义外键为级联操作(on delete cascade:删除主表数据,从表也会被删除掉数据):

因为删除是不可逆的过程,所以我们做好还是使用set null
5.主表更新:on update来标识

我们接下来单独测试on update,如下:
我们先重新维护一下数据:

重新删除外键,设置外键:

此时我们更新主表itcast_class,我们发现主表不能更新,这是因为之前我们已经设置外键update restrict:
更新存在关联的主表数据的主键字段出现的问题如下:

MySQL(10):实体、实体表和外键(foreign key)的更多相关文章
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- Oracle外键(Foreign Key)使用详细的说明(一)
Oracle外键(Foreign Key)使用详细的说明(一) 1.目标 演示如何Oracle使用外键数据库 2.什么是外键? 1)在Oracle数据库中,外键是用来实现參照完整性的方法之中的一个.打 ...
- MYSQL外键(Foreign Key)的使用
在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束.外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持): ...
- MySQL建立外键(Foreign Key)
如果在最初建立表的时候就建立外键这样一般不会有什么问题,顺便说一下建立外键的时候,需要注意的地方. cascade方式在父表上update/delete记录时,同步update/delete掉子表的匹 ...
- 组合外键(FOREIGN KEY)
一张表,它的外键即是参考另一张表的主键,但这些关联键是组合键,由2列或多列组成. 你可以先看看这篇<多列组合为主键(PRIMARY KEY)>https://www.cnblogs.com ...
- 外键(foreign key)的使用及其优缺点
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表. ...
- MySQL基础day03 存储引擎和外键MySQL 5.6
MySQL基础day03_存储引擎和外键-MySQL 5.6 外键的条件: 1,表的存储引擎为innodb存储引擎 2,表中外键字段的类型要与参考表的字段类型一致 3,外键字段要是索引类型中的一种 M ...
- mysql 约束条件 外键 forigen key 介绍
外键 forigen key作用 :建立表之间的关系 什么是外键 员工信息表有这些字段:id号 姓名 性别 员工所在部门名 部门描述信息 公司有3个部门,但是有1个亿的员工,那意味着 员工所对应的部 ...
- mysql修改删除列,删除有外键依赖的列
–重命名表rename table t_softwareport to software_port; –建立外键alter table software_port add constraint fk_ ...
随机推荐
- 无聊拿socket写的100以内的加法考试。。。
用的广播IP,所以校内网不用设置,直接在校内网随便找台电脑打开服务端,然后再随便找台电脑打开客户端,然后就可以做100以内的加法了... 说明:客户端输入“ready”,服务端会随机发送一条加法算式, ...
- [BZOJ 3585] mex 【莫队+分块】
题目链接:BZOJ - 3585 题目分析 区间mex,即区间中没有出现的最小自然数. 那么我们使用一种莫队+分块的做法,使用莫队维护当前区间的每个数字的出现次数. 然后求mex用分块,将权值分块(显 ...
- ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewCointroller时在这几个函数中应该做什么工作?
由init.loadView.viewDidLoad.viewDidUnload.dealloc的关系说起 init方法 在init方法中实例化必要的对象(遵从LazyLoad思想) init方法中初 ...
- mysql左联右联内联
在MySQL中由于性能的关系,常常要将子查询(Sub-Queries)用连接(join)来却而代之,能够更好地使用表中索引提高查询效率. 下面介绍各种join的使用,先上图: 我们MySQL常用的为左 ...
- LED七彩变色灯的制作
LED变色灯是一种新型灯泡.它的外形与一般乳白色白炽灯泡相同,但点亮后会自动按一定的时间间隔变色.循环地发出青.黄.绿.紫.蓝.红.白色光.它适用于家庭生日派对.节日聚会.过节过年,给节日添加欢乐气氛 ...
- 《Effective C++》条款26 防卫潜伏的ambiguity模棱两可的状态
每个人都有思想.有些人相信自由经济学,有些人相信来生.有些人甚至相信COBOL是一种真正的程序设计语言.C++也有一种思想:它认为潜在的二义性不是一种错误.ambiguity 这是潜在二义性的一个例子 ...
- mapreduce引用第三方jar
要想让mapreduce程序引用第三方jar文件, 可以采用如下方式: 通过命令行参数传递jar文件, 如-libjars等; 直接在conf中设置, 如conf.set(“tmpjars”,*.ja ...
- ♫【模式】自定义函数(self-defining function)
<JavaScript模式> /** * 如果创建了一个新函数并且将其分配给保存了另外函数的同一个变量,那么就以一个新函数覆盖旧函数. * 在某种程度上,回收旧函数指针以指向一个新函数.而 ...
- Azure SQL 数据库的灵活缩放预览版简介
Eron Kelly SQL Server 产品管理部门产品市场营销总经理 几天前,我们宣布了发布 Azure SQL 数据库的灵活缩放公共预览版.新增的灵活缩放功能通过简化开发和管理,简化了扩展和缩 ...
- OA系统配置文件
第一章 web.xml配置文件解读 1. web.xml文件解读 lemon OA系统的核心配置文件都放在spring目录下的具有applicationContext的前缀文件.Classpath后有 ...