MySQL 外键约束和表关系相关总结
本篇文章向大家介绍《MySQL 外键约束和表关系相关总结》,主要包括MySQL外键约束、表关系,具有一定的参考价值,需要的朋友可以参考一下。
外键(Foreign Key)
按照上述所说,一张表存储员工信息会极大的浪费资源,重复数据太多,这个问题就类似于将所有的代码都写在了一个py文件中,因此我们可以将一个表拆成不同的表,在这不同的表之间建立关联,而建立关联就需要使用外键foreign key。外键也属于约束条件的一种。
如何确定表关系
表与表之间的关系有三种一对多、多对多、一对一。那么如何确定表与表之间的关系呢?
在确定表与表之间的关系时建议换位思考,什么意思呢?就是分别站在两张表的角度去考虑,比如员工表和部门表的关系:
先站在员工表的角度:员工表中一个员工能否属于多个部门呢?答案是不能
再站在部门表的角度:部门表中一个部门能否有多个员工呢?答案是可以
因此员工表与部门表是单向的一对多,那么员工表和部门表就是一对多的关系。
如何建立表关系
在建立表关系时,表与表之间的关联通常以主键id作为关联字段。
一对多关系 - 员工表和部门表
在MySQL的关系在没有多对一的概念,一对多和多对一都是一对多。在创建一对多表关系时需要遵循以下几点:
第一,外键字段建立在多的一方,即员工表
第二,在创建表的时候,一定要先创建被关联一方,即部门表
第三,在录入数据的时候也必须先录入被关联表的数据,即部门表的数据
第四,当不同的表建立关系时,需要进行级联更新和删除也可以称为同步更新同步删除,如果不建立级联更新和删除的话,无法对被关联表中被关联的数据进行删除或者修改id的操作,因为两张表是相互关联的。
-- 创建被关联表,部门表 mysql> create table bm( id int primary key auto_increment, bm_name varchar(10), bm_desc char(64) ); Query OK, 0 rows affected (0.01 sec) mysql> desc bm; +---------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | bm_name | varchar(10) | YES | | NULL | | | bm_desc | char(64) | YES | | NULL | | +---------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) -- 创建外键所在的表,员工表 mysql> create table yg( id int primary key auto_increment, yg_name varchar(6), bm_id int, foreign key(bm_id) references bm(id) -- 表示bm_id是外键字段,关联到bm表中的id字段 on update cascade # 级联更新 on delete cascade # 级联删除 ); Query OK, 0 rows affected (0.10 sec) mysql> desc yg; +---------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | yg_name | varchar(6) | YES | | NULL | | | bm_id | int(11) | YES | MUL | NULL | | +---------+------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) -- 插入数据 mysql> insert into bm (bm_name, bm_desc) values ('python', '人生苦短'),('go', 'let us go'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from bm; +----+---------+--------------+ | id | bm_name | bm_desc | +----+---------+--------------+ | 1 | python | 人生苦短 | | 2 | go | let us go | +----+---------+--------------+ 2 rows in set (0.00 sec) mysql> insert into yg (yg_name, bm_id) values ('xu', 1), ('zhuang', 2), ('lili', 1); Query OK, 3 rows affected (0.09 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from yg; +----+---------+-------+ | id | yg_name | bm_id | +----+---------+-------+ | 2 | xu | 1 | | 3 | zhuang | 2 | | 4 | lili | 1 | +----+---------+-------+ 3 rows in set (0.00 sec) -- 外键关联的数据必须在被关联表中存在否则会报错哦~ mysql> insert into yg (yg_name, bm_id) values ('xu', 3); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`book_manage`.`yg`, CONSTRAINT `yg_ibfk_1` FOREIGN KEY (`bm_id`) REFERENCES `bm` (`id`)) -- 如果不使用级联更新和删除的话会出现下面的错误,下述的SQL语句后面的文章都会介绍。。。 mysql> update bm set id=5 where id=2; -- 将bm表中id=2的记录改为id=5 ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`book_manage`.`yg`, CONSTRAINT `yg_ibfk_1` FOREIGN KEY (`bm_id`) REFERENCES `bm` (`id`)) mysql> delete from bm where id =2; -- 删除bm表中id为2的那条记录 ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`book_manage`.`yg`, CONSTRAINT `yg_ibfk_1` FOREIGN KEY (`bm_id`) REFERENCES `bm` (`id`))
多对多
多对多的关系以书籍和作者为例进行详细介绍,为什么书籍和作者属于多对多的关系呢?
先站在书籍表的角度:一本书是否可以有多个作者?答案是可以
再站在作者表的角度:一个作者是否可以写多本书?答案是可以
书籍表和作者表是双向的一对多那么这两张表的关系就是多对多。
我们先来创建两张表:
-- 创建书籍表 create table book( id int primary key auto_increment, title varchar(32), price int, author_id int, foreign key(author_id) references author(id) on update cascade on delete cascade ); -- 创建作者表 create table author( id int primary key auto_increment, name varchar(32), age int, book_id int, foreign key(book_id) references book(id) on update cascade on delete cascade );
如果按照上述方式创建表的话肯定是不可能成功的,在创建一对多的表关系时我我们说要先创建被关联表,也就是没有外键的表,可是多对多关系是双向的一对多,每张表中都会有外键的存在,怎么办呢?解决方案就是创建第三张表,这第三张表用来专门存储多对多关系的两张表的关联。
-- 创建书籍表 mysql> create table book( id int primary key auto_increment, name varchar(10), price int ); Query OK, 0 rows affected (0.01 sec) -- 创建作者表 mysql> create table author( id int primary key auto_increment, name varchar(6), age int ); Query OK, 0 rows affected (0.01 sec) -- 创建第三章表,存储book和author表的关联关系 mysql> create table book2author( 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); Query OK, 0 rows affected (0.02 sec)
一对一
如果一张表的字段特别多,每次查询数据时又不是所有的字段都能用的到,我们就可以将表一一分为二,比如说用户信息表,用户的信息包括用户名 密码 用户的年龄 用户的性别 地址 电话等等,可能经常用的只有用户的用户名和密码,这种情况我们就可以将一张用户信息表拆分成用户基本信息表和用户详细信息表,同样判断这两张表的关系还是通过换位思考:
首先看用户基本信息表:一个用户能否有多个详细信息?答案是不可以;
再看用户详情表:一个用户详情能否属于多个用户?答案是不可以;
单向的一对多都不成立,那么两者之间的表关系就是一对一或者没有关系。
使用SQL语句建立一对一的外键关系时,外键建在任意一方都可以,但是推荐将外键建在查询频率较高的表中,同样的,在创建表时还是先创建被关联表。
-- 创建用户详情表 create table authordetail( id int primary key auto_increment, phone int, addr varchar(64) ); -- 用户基本信息表 create table author( id int primary key auto_increment, name varchar(32), age int, authordetali_id int, foreign key(authordetali_id) references authordetali(id) on update cascade on delete cascade );
表关系总结
表关系建立需要使用外键foreign key,判断表与表之间的关系通过换位思考的方式。
一对多表关系:外键建在多的一方
一对一表关系:外键建在任意一方都可以,推荐建在查询频率高的一方
多对多表关系:需要单独创建第三张表存储两张表的关联关系
文中关于mysql的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《MySQL 外键约束和表关系相关总结》文章吧,也可关注golang学习网公众号了解相关技术文章。

- 上一篇
- MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因

- 下一篇
- MySQL REVOKE实现删除用户权限
-
- 迷人的金针菇
- 这篇文章太及时了,太细致了,很棒,已收藏,关注up主了!希望up主能多写数据库相关的文章。
- 2023-03-04 21:40:14
-
- 懦弱的睫毛膏
- 细节满满,码住,感谢作者大大的这篇博文,我会继续支持!
- 2023-01-10 17:37:17
-
- 刻苦的过客
- 这篇技术贴太及时了,太全面了,感谢大佬分享,码起来,关注大佬了!希望大佬能多写数据库相关的文章。
- 2023-01-10 04:23:50
-
- 细心的自行车
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢楼主分享文章内容!
- 2023-01-08 22:59:43
-
- 数据库 · MySQL | 2天前 |
- 如何检测电脑是否安装MySQL的5种方法
- 278浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL分区表查询优化技巧
- 126浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL建库语句与字符集设置教程
- 414浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL中AS别名用法详解
- 320浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL创建带主键的表实例
- 247浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- 主外键关系怎么建立?
- 149浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL中IF函数使用详解
- 392浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL中IF函数使用详解
- 268浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL入门:核心概念与操作全解析
- 162浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL事务是什么?如何保证数据一致性?
- 349浏览 收藏
-
- 数据库 · MySQL | 6天前 |
- MySQL数据分片实现方法及常见方案解析
- 363浏览 收藏
-
- 数据库 · MySQL | 6天前 |
- MySQL基础:增删改查全教程
- 345浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 515次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 499次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- AI Mermaid流程图
- SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
- 793次使用
-
- 搜获客【笔记生成器】
- 搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
- 809次使用
-
- iTerms
- iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
- 830次使用
-
- TokenPony
- TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
- 893次使用
-
- 迅捷AIPPT
- 迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
- 779次使用
-
- MySQL主从切换的超详细步骤
- 2023-01-01 501浏览
-
- Mysql-普通索引的 change buffer
- 2023-01-25 501浏览
-
- MySQL高级进阶sql语句总结大全
- 2022-12-31 501浏览
-
- Mysql报错:message from server: * is blocked because of many
- 2023-02-24 501浏览
-
- 腾讯云大佬亲码“redis深度笔记”,不讲一句废话,全是精华
- 2023-02-22 501浏览