文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-05-18 22:17

关注

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

  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:更新与删除都需要考虑到关联与被关联的关系。

解决方案:

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

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


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)用法内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯