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

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

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

  • 表的组织结构复杂不清晰
  • 浪费空间
  • 扩展性极差
  • 为了解决上述的问题,就需要用多张表来存放数据。

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

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

    多对一关系:

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

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

    part1:

  • 先站在表emp的角度
  • 去找表emp的多条记录能否对应表dep的一条记录。
  • 翻译2的意义:
    左表emp的多条记录==》多个员工
    右表dep的一条记录==》一个部门
    最终翻译结果:多个员工是否可以属于一个部门?
  • 如果是则需要进行part2的流程

    part2:

  • 站在表dep的角度
  • 去找表dep的多条记录能否对应表emp的一条记录
  • 翻译2的意义:
    右表dep的多条记录==》多个部门
    左表emp的一条记录==》一个员工
  • 最终翻译结果:多个部门是否可以包含同一个员工
    如果不可以,则可以确定emp与dep的关系只一个单向的多对一
    如何实现?
    此时就可以用到外键了,在emp表中新增一个dep_id字段,该字段指向dep表的id字段

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

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

  • create table dep(
  • id int primary key auto_increment,
  • dep_name char(10),
  • dep_comment char(60)
  • );
  • create table emp(
  • id int primary key auto_increment,
  • name char(16),
  • gender enum('male','female') not null default 'male',
  • dep_id int,
  • foreign key(dep_id) references dep(id)
  • );
  • 约束2:在插入记录时,必须先插被关联的表dep,才能插关联表emp

  • insert into dep(dep_name,dep_comment) values
  • ('教学部','辅导学生学习,教授课程'),
  • ('公关部','处理公关危机'),
  • ('技术部','开发项目,研究技术');
  • insert into emp(name,gender,dep_id) values
  • ('monicx0','male',1),
  • ('monicx1','male',2),
  • ('monicx2','male',1),
  • ('monicx3','male',1),
  • ('lili','female',3);
  • MySQL 外键(FOREIGN KEY)用法案例详解

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

    解决方案:

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

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

  • create table dep(
  • id int primary key auto_increment,
  • dep_name char(10),
  • dep_comment char(60)
  • );
  • create table emp(
  • id int primary key auto_increment,
  • name char(16),
  • gender enum('male','female') not null default 'male',
  • dep_id int,
  • foreign key(dep_id) references dep(id)
  • on update cascade
  • on delete cascade
  • );
  • 此时再去修改:

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

    得到结果:

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

    此时再去删除:

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

    得到结果:

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

    多对多的关系:

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

    如何实现?

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

  • create table author(
  • id int primary key auto_increment,
  • name char(16)
  • );
  • create table book(
  • id int primary key auto_increment,
  • bname char(16),
  • price int
  • );
  • insert into author(name) values
  • ('monicx1'),
  • ('monicx2'),
  • ('monicx3')
  • ;
  • insert into book(bname,price) values
  • ('python从入门到入土',200),
  • ('liunx从入门到入土',400),
  • ('java从入门到入土',300),
  • ('php从入门到入土',100)
  • ;
  • #建立第三张表:
  • create table author2book(
  • id int primary key auto_increment,
  • author_id int,
  • book_id int,
  • foreign key(author_id) references author(id)
  • on update cascade
  • on delete cascade,
  • foreign key(book_id) references book(id)
  • on update cascade
  • on delete cascade
  • );
  • insert into author2book(author_id,book_id) values
  • (1,3),
  • (1,4),
  • (2,2),
  • (2,4),
  • (3,1),
  • (3,2),
  • 一对一关系左表的一条记录唯一对应右表的一条记录,反之也一样

  • create table customer(
  • id int primary key auto_increment,
  • name char(20) not null,
  • qq char(10) not null,
  • phone char(16) not null
  • );
  • create table student(
  • id int primary key auto_increment,
  • class_name char(20) not null,
  • customer_id int unique, #该字段一定要是唯一的
  • foreign key(customer_id) references customer(id) #此时外键的字段一定要保证unique
  • on delete cascade
  • on update cascade
  • );
  • 到此这篇关于MySQL 外键(FOREIGN KEY)用法案例详解的文章就介绍到这了,更多相关MySQL 外键(FOREIGN KEY)用法内容请搜索钦钦技术栈以前的文章或继续浏览下面的相关文章希望大家以后多多支持钦钦技术栈!

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

    版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/5854/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

    (0)
    上一篇 2022年 7月 27日 9:50:16
    下一篇 2022年 7月 27日 9:50:27

    软件定制开发公司

    相关阅读

    发表回复

    登录后才能评论
    通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!