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之外键的主要内容,如果未能解决你的问题,请参考以下文章

MySQL基础之 主键外键设置

day2mysql主键外键自增

( 10 )MySQL中的外键

mysql 语句 字段 和结构主键外键的增删改

mysql数据库基础(2)索引主键复合主键外键

数据表操作与主键外键唯一键使用