网站首页 > 技术文章 正文
在学习关系型数据库的时候,常常听到主键外键的概念。他们都起到了什么作用?
他们和索引有什么关系?
说明:本文所探讨的概念基于MySQL 8.0 Innodb,其他版本或数据库可能略有差异。
为了方便阅读,每节的课代表部分做了总结,可以直接跳转。
基本知识
本节简单介绍下关系型数据库的特点,便于后续讲解。
关系型数据库中的数据以表的形式存储,每个表由行(Record)和列(Column)组成。
数据库表本质上是一个二维表,在列上定义字段,行上存储数据。
字段上可以定义数据类型,是否为空,是否唯一等规则。
表和表之间可以有关联关系,一对一、一对多的关系,也可以没有关联关系。
常见的MySQL、Oracle、SQL Server、PostgreSQL等都是关系型数据库。
主键
也叫PRIMARY KEY,从字面来看,主键就是主要的键,用来标识一行数据的唯一特征。
就像我们每个人都有一个身份证号,在全国范围内唯一。对于数据库中的数据也是一样,需要有一个字段来区别。
一般情况下,我们会用一个与业务无关的唯一值来做主键,并不是直接使用业务字段。
比如人员表中,不会直接用用户的身份证号来做主键,而是使用一个唯一不重复的值用来做主键。
在MySQL中,常用来做主键的是两种数据类型:数值型和字符串型。
数值型:自增数值。
字符串型:唯一随机字符串,比如UUID、MD5值。
两种数据类型有什么优劣?该如何选择?本文不是重点,后续会专门讲解,这里先给出结论:
一般而言,主键的数据类型一般选择数值类型,值要有序,根据数据规模选择自增值或者使用雪花算法生成的范围有序值。
此外,MySQL会根据主键值建立聚簇索引,提高数据的检索速度,由于索引结构的特点,更应该使用有序的数值作为主键值,关于索引的知识,可以参考我的一篇文章三言两语聊MySQL 索引。
联合主键
有时候,一个字段难以确定唯一性,这就需要用到联合主键了。即使用两个或者两个以上的字段做联合主键。
联合主键允许部分字段值重复,只要联合主键包含的全部字段值不重复即可。
联合主键带来了表关系的复杂度,实际很少使用。
课代表
主键是一种用来唯一标识表中每一条记录的字段或字段组合,主键的值必须唯一且非空。
主键会自动创建索引,起到加快数据检索的速度。
一般情况下,主键的数据类型为数值型,使用自增或者雪花算法生成范围递增值。
关于主键,你学会了吗?不定期更新数据库的相关知识,便于及时得到推送,欢迎关注!
外键
主键的作用搞明白了,外键是个什么鬼?外在的键?外来的键?
先卖个关子,首先来看个场景。
电商系统有订单,订单有明细,常见的表结构就是订单表和订单明细表,订单和订单明细是组合关系(组合关系是什么?后边会专门介绍数据之间的关系),它们之间怎么进行关联呢?
一般做法是在订单明细表中记录订单编号,比如在订单明细表添加一个订单编号的字段,并记录订单编号。
在定义表结构的时候,会把这个字段定义成外键(Foreign Key referencing Users table)。
聪明的小伙伴总是爱问为什么,不设置成外键行不行?
外键是用来建立表之间关联关系的约束,作用是保证数据的完整性和一致性。
外键定义了表之间的引用关系,确保一个表中的值在另一张表中一定存在。
回到前边的问题,如果不设置成外键,会有什么影响?
- 无法保证值在另一张表中一定存在
- 没办法做到级联操作,需要自己处理级联关系的数据
第一点会导致出现脏数据,比如在订单明细表中填写一个不存在的订单编码,第二点是在删除订单的时候级联删除订单明细,如果没有外键,需要自己手动删除。
为什么很多公司禁止使用外键呢?背后隐藏着什么血与泪呢?
在阿里编码规范中强制禁止使用外键,应该把外键的逻辑关系放到应用层中。
这是因为外键约束会降低数据库的性能,在对性能要求比较高的时候,相比较在应用层保证逻辑正确性的成本要低于使用外键。
课代表
外键(Foreign Key)是一种用来建立表与表之间关联关系的约束,用于保持数据完整性和一致性。
外键的作用有:
- 建立关联关系
- 保证数据的完整性和一致性
- 级联操作
本文主要讲了主键和外键的概念和作用,在工作中,对主键的接触可能比外键多,所以着重介绍了主键的类型选择。
猜你喜欢
- 2025-07-23 Navicat Data Modeler使用教程十二:配置
- 2025-07-23 软件测试|数据库的内连接,左连接,右链接分别是什么
- 2025-07-23 每日学习“IT”是什么呢?(每日学习每日一词)
- 2025-07-23 SQLite:小众?其实它比你想象的更普及,连这个领域都有人用!
- 2025-07-23 【推荐】一款实用且跨平台的数据库管理神器,支持Web浏览器
- 2025-07-23 Spring Batch中的JobRepository:批处理的“记忆大师”是如何工作
- 2025-07-23 关系型数据库与非关系型数据库(关系型数据库与非关系型数据库的特点及各自的优缺点)
- 2025-07-23 阿里云代理商:关系型数据库与NoSQL数据库的区别与选择
- 2025-07-23 Mybatis框架学习指南-第二节内容(mybatis框架的主要配置)
- 2024-10-26 数据产品经理技能必备:MySQL入门 数据产品经理有前途吗
你 发表评论:
欢迎- 630℃几个Oracle空值处理函数 oracle处理null值的函数
- 623℃Oracle分析函数之Lag和Lead()使用
- 612℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 606℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 604℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 596℃【数据统计分析】详解Oracle分组函数之CUBE
- 586℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 570℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- oracle 19cOCM认证有哪些内容(oracle认证ocm月薪)
- Oracle新出AI课程认证,转型要持续学习
- oracle 表的查询join顺序,可能会影响查询效率
- Oracle DatabaseAmazon Web Services正式可用,Oracle数据库上云更容易了
- Oracle 19.28 RU 升级最佳实践指南
- 汉得信息:发布EBS系统安装启用JWS的高效解决方案
- 如何主导设计一个亿级高并发系统架构-数据存储架构(三)
- Java 后端开发必看!工厂设计模式轻松拿捏
- ORA-00600 「25027」 「x」报错(抱错孩子电视剧 爸爸是武术 另一个爸爸是画家)
- 新项目终于用上了jdk24(jdk新建项目)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)