• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL 外键(FOREIGN KEY)用法案例详解
    POST TIME:2021-10-18 19:21

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

    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

    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);

    约束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
    );

    此时再去修改:

    得到结果:

    此时再去删除:

    得到结果:

    多对多的关系:

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

    如何实现?

    建立第三张表,该表中有一个字段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)用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • MySQL 到底是如何做到多版本并发的?
    • mysql过滤复制思路详解
    • MySQL如何利用存储过程快速生成100万条数据详解
    • Python接口自动化浅析pymysql数据库操作流程
    • MySQL事务控制流与ACID特性
    • Mysql使用存储过程快速添加百万数据的示例代码
    • MySQL去除重叠时间求时间差和的实现
    • Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
    • MySQL的全局锁和表级锁的具体使用
    • 基于Redo Log和Undo Log的MySQL崩溃恢复解析
    上一篇:MySQL如何利用存储过程快速生成100万条数据详解
    下一篇:mysql过滤复制思路详解
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信