服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL 外键(FOREIGN KEY)用法案例详解

MySQL 外键(FOREIGN KEY)用法案例详解

2021-09-24 16:59miaoqinian Mysql

这篇文章主要介绍了MySQL 外键(FOREIGN KEY)用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

引子:把所有数据都存放于一张表的弊端

  1. 表的组织结构复杂不清晰
  2. 浪费空间
  3. 扩展性极差

为了解决上述的问题,就需要用多张表来存放数据。

表与表的记录之间存在着三种关系:一对多、多对多、一对一的关系。

处理表之间关系问题就会利用到FOREIGN KEY

多对一关系:

寻找表与表之间的关系的套路

举例:雇员表:emp表   部门:dep表

part1:

  1. 先站在表emp的角度
  2. 去找表emp的多条记录能否对应表dep的一条记录。
  3. 翻译2的意义:
    左表emp的多条记录==》多个员工
    右表dep的一条记录==》一个部门
    最终翻译结果:多个员工是否可以属于一个部门?

            如果是则需要进行part2的流程

part2:

  1. 站在表dep的角度
  2. 去找表dep的多条记录能否对应表emp的一条记录
  3. 翻译2的意义:
    右表dep的多条记录==》多个部门
    左表emp的一条记录==》一个员工

            最终翻译结果:多个部门是否可以包含同一个员工
如果不可以,则可以确定emp与dep的关系只一个单向的多对一
如何实现?
此时就可以用到外键了,在emp表中新增一个dep_id字段,该字段指向dep表的id字段

foreign key会带来什么样的效果?

约束1:在创建表时,先建被关联的表dep,才能建关联表emp

  1. create table dep(
  2. id int primary key auto_increment,
  3. dep_name char(10),
  4. dep_comment char(60)
  5. );
  6.  
  7. create table emp(
  8. id int primary key auto_increment,
  9. name char(16),
  10. gender enum('male','female') not null default 'male',
  11. dep_id int,
  12. foreign key(dep_id) references dep(id)
  13. );

约束2:在插入记录时,必须先插被关联的表dep,才能插关联表emp

  1. insert into dep(dep_name,dep_comment) values
  2. ('教学部','辅导学生学习,教授课程'),
  3. ('公关部','处理公关危机'),
  4. ('技术部','开发项目,研究技术');
  5.  
  6. insert into emp(name,gender,dep_id) values
  7. ('monicx0','male',1),
  8. ('monicx1','male',2),
  9. ('monicx2','male',1),
  10. ('monicx3','male',1),
  11. ('lili','female',3);

MySQL 外键(FOREIGN KEY)用法案例详解

约束3:更新与删除都需要考虑到关联与被关联的关系。

解决方案:

1、先删除关联表emp,再删除被关联表dep,准备重建

2、重建:新增功能,同步更新,同步删除

  1. create table dep(
  2. id int primary key auto_increment,
  3. dep_name char(10),
  4. dep_comment char(60)
  5. );
  6.  
  7. create table emp(
  8. id int primary key auto_increment,
  9. name char(16),
  10. gender enum('male','female') not null default 'male',
  11. dep_id int,
  12. foreign key(dep_id) references dep(id)
  13. on update cascade
  14. on delete cascade
  15. );

此时再去修改:

MySQL 外键(FOREIGN KEY)用法案例详解

得到结果:

MySQL 外键(FOREIGN KEY)用法案例详解

此时再去删除:

MySQL 外键(FOREIGN KEY)用法案例详解

得到结果:

MySQL 外键(FOREIGN KEY)用法案例详解

多对多的关系:

两张表记录之间是一个双向的多对一关系,称之为多对多关系。

如何实现?

建立第三张表,该表中有一个字段foreign key左表的id,还有一个字段是foreign key右表的id

  1. create table author(
  2. id int primary key auto_increment,
  3. name char(16)
  4. );
  5.  
  6. create table book(
  7. id int primary key auto_increment,
  8. bname char(16),
  9. price int
  10. );
  11.  
  12. insert into author(name) values
  13. ('monicx1'),
  14. ('monicx2'),
  15. ('monicx3')
  16. ;
  17. insert into book(bname,price) values
  18. ('python从入门到入土',200),
  19. ('liunx从入门到入土',400),
  20. ('java从入门到入土',300),
  21. ('php从入门到入土',100)
  22. ;
  23. #建立第三张表:
  24. create table author2book(
  25. id int primary key auto_increment,
  26. author_id int,
  27. book_id int,
  28. foreign key(author_id) references author(id)
  29. on update cascade
  30. on delete cascade,
  31. foreign key(book_id) references book(id)
  32. on update cascade
  33. on delete cascade
  34. );
  35.  
  36. insert into author2book(author_id,book_id) values
  37. (1,3),
  38. (1,4),
  39. (2,2),
  40. (2,4),
  41. (3,1),
  42. (3,2),

一对一关系左表的一条记录唯一对应右表的一条记录,反之也一样

  1. create table customer(
  2. id int primary key auto_increment,
  3. name char(20) not null,
  4. qq char(10) not null,
  5. phone char(16) not null
  6. );
  7.  
  8. create table student(
  9. id int primary key auto_increment,
  10. class_name char(20) not null,
  11. customer_id int unique, #该字段一定要是唯一的
  12. foreign key(customer_id) references customer(id) #此时外键的字段一定要保证unique
  13. on delete cascade
  14. on update cascade
  15. );

到此这篇关于MySQL 外键(FOREIGN KEY)用法案例详解的文章就介绍到这了,更多相关MySQL 外键(FOREIGN KEY)用法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/miaoqinian/article/details/80252715

延伸 · 阅读

精彩推荐
  • Mysqlwindows10更换mysql8.0.17详细教程

    windows10更换mysql8.0.17详细教程

    这篇文章主要为大家介绍了windows10更换mysql8.0.17的详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    逍遥_0012112020-12-01
  • Mysqlwindows下如何安装和启动MySQL

    windows下如何安装和启动MySQL

    本篇文章主要给大家介绍windows下如何安装和启动MySQL,需要的朋友跟着小编一起来学习啦 ...

    MRR6312020-05-18
  • Mysqllinux下mysql5.7.17最新稳定版本安装教程

    linux下mysql5.7.17最新稳定版本安装教程

    这篇文章主要为大家详细介绍了linux上mysql5.7.17最新稳定版本安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    沐雨听涛4322020-07-16
  • MysqlMySQL故障切换笔记之应用无感知设计详解

    MySQL故障切换笔记之应用无感知设计详解

    这篇文章主要给大家介绍了关于MySQL故障切换笔记之应用无感知设计的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参...

    Win-Man4252019-06-29
  • MysqlMySQL使用临时表加速查询的方法

    MySQL使用临时表加速查询的方法

    这篇文章主要介绍了MySQL使用临时表加速查询的方法,分析了针对多次重复查询使用临时表的优势,是非常实用的技巧,需要的朋友可以参考下 ...

    MYSQL教程网5712020-04-26
  • MysqlMysql查询很慢卡在sending data的原因及解决思路讲解

    Mysql查询很慢卡在sending data的原因及解决思路讲解

    今天小编就为大家分享一篇关于Mysql查询很慢卡在sending data的原因及解决思路讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要...

    hhgood5032020-09-20
  • Mysql详解Mysql order by与limit混用陷阱

    详解Mysql order by与limit混用陷阱

    这篇文章主要介绍了详解Mysql order by与limit混用陷阱,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    邹没钱3742021-06-30
  • MysqlMysql 如何查询时间段交集

    Mysql 如何查询时间段交集

    这篇文章主要介绍了Mysql 查询时间段交集的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    血色0记忆7052021-08-16