mysql之外键
Posted blue-tea
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql之外键相关的知识,希望对你有一定的参考价值。
一对多关系
先定义一张部门员工表:
把所有数据都存放于一张表有如下弊端:
①.组织结构不清晰;②.浪费硬盘空间;③.表的扩展性极差。
类似于我们将所有的代码都写在用一个py文件内,在确立表与表之间的关系时,一定要换位思考(即两方都考虑周全之后才能得出结论)。
以员工表和部门表为例:
1.站在员工表: 看能否有多个员工对应一个部门(即:一个部门能否有多个员工),如果可以(暂时只能确定员工单向多对一部门)。
2.站在部门表: 看能否有多个部门对应一个员工(即:一个员工能否属于多个部门),如果不可以,就能得出结论:员工表和部门表之间仅仅是单向的多对一。
表关系中没有多对一这个说法,只有一对多(无论是多对一还是一对多都叫"一对多")
外键(foreign key)
如果要让两种表有代码层面上真正的关联,就必须使用外键。
什么是外键?
让表与表有硬性层面上的关系。外键只是建立表与表之间的联系,不是一对多特有的。
外键约束有哪些?
1.在创建表的时候 必须先创建被关联表
2.插入数据的时候 也必须先插入被关联表的数据
外键虽然能够帮你强制建立表关系,但是也会给表之间增加数据相关的约束。
1.在修改或删除数据的时候,首先要删员工表的数据,然后才能删部门表的数据,反之会报错。
2.级联更新级联删除。 on update cascade(同步更新);on delete cascade(同步删除)。
多对多关系
以图书表与作者表之间的关系为例:
仍然站在两张表的角度:
1.站在图书表:一本书可不可以有多个作者,可以!那就是书多对一作者
2.站在作者表:一个作者可不可以写多本书,可以!那就是作者多对一书
双方都能一条数据对应对方多条记录,这种关系就是多对多!
在创建表时遇到了一个问题,即创建图书表需要有一个外键关联作者,创建作者表也需要有一个外键字段关联图书。问题来了,先创建谁都不合适,如何解决?
解决方法: 建立第三张表,该表中有一个字段fk左表的id,还有一个字段是fk右表的id。
一对一关系
左表的一条记录唯一对应右表的一条记录,反之也是一样。在编写代码时,一定要用unique来确定该字段是唯一的。
三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系。
修改表
语法:
1. 修改表名
ALTER TABLE 表名;RENAME 新表名;
2. 增加字段
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
3. 删除字段
ALTER TABLE 表名
DROP 字段名;
4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
ALTER TABLE 表名
MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
复制表
查询语句执行的结果也是一张表,可以看成虚拟表
复制表结构+记录 (key不会复制: 主键、外键和索引)
create table new_service select * from service;
只复制表结构
select * from service where 1=2; //条件为假,查不到任何记录
以上是关于mysql之外键的主要内容,如果未能解决你的问题,请参考以下文章