百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

主键外键“键键不止”,他们都是干什么的

toyiye 2024-06-21 12:23 11 浏览 0 评论

在学习关系型数据库的时候,常常听到主键外键的概念。他们都起到了什么作用?

他们和索引有什么关系?

说明:本文所探讨的概念基于MySQL 8.0 Innodb,其他版本或数据库可能略有差异。

为了方便阅读,每节的课代表部分做了总结,可以直接跳转。

基本知识

本节简单介绍下关系型数据库的特点,便于后续讲解。

关系型数据库中的数据以表的形式存储,每个表由行(Record)和列(Column)组成。

数据库表本质上是一个二维表,在列上定义字段,行上存储数据。

字段上可以定义数据类型,是否为空,是否唯一等规则。

表和表之间可以有关联关系,一对一、一对多的关系,也可以没有关联关系。

常见的MySQL、Oracle、SQL Server、PostgreSQL等都是关系型数据库。

主键

也叫PRIMARY KEY,从字面来看,主键就是主要的键,用来标识一行数据的唯一特征。

就像我们每个人都有一个身份证号,在全国范围内唯一。对于数据库中的数据也是一样,需要有一个字段来区别。

一般情况下,我们会用一个与业务无关的唯一值来做主键,并不是直接使用业务字段。

比如人员表中,不会直接用用户的身份证号来做主键,而是使用一个唯一不重复的值用来做主键。

在MySQL中,常用来做主键的是两种数据类型:数值型和字符串型。

数值型:自增数值。

字符串型:唯一随机字符串,比如UUID、MD5值。

两种数据类型有什么优劣?该如何选择?本文不是重点,后续会专门讲解,这里先给出结论:

一般而言,主键的数据类型一般选择数值类型,值要有序,根据数据规模选择自增值或者使用雪花算法生成的范围有序值。

此外,MySQL会根据主键值建立聚簇索引,提高数据的检索速度,由于索引结构的特点,更应该使用有序的数值作为主键值,关于索引的知识,可以参考我的一篇文章三言两语聊MySQL 索引

联合主键

有时候,一个字段难以确定唯一性,这就需要用到联合主键了。即使用两个或者两个以上的字段做联合主键。

联合主键允许部分字段值重复,只要联合主键包含的全部字段值不重复即可。

联合主键带来了表关系的复杂度,实际很少使用。

课代表

主键是一种用来唯一标识表中每一条记录的字段或字段组合,主键的值必须唯一且非空。

主键会自动创建索引,起到加快数据检索的速度。

一般情况下,主键的数据类型为数值型,使用自增或者雪花算法生成范围递增值。

关于主键,你学会了吗?不定期更新数据库的相关知识,便于及时得到推送,欢迎关注!

外键

主键的作用搞明白了,外键是个什么鬼?外在的键?外来的键?

先卖个关子,首先来看个场景。

电商系统有订单,订单有明细,常见的表结构就是订单表和订单明细表,订单和订单明细是组合关系(组合关系是什么?后边会专门介绍数据之间的关系),它们之间怎么进行关联呢?

一般做法是在订单明细表中记录订单编号,比如在订单明细表添加一个订单编号的字段,并记录订单编号。

在定义表结构的时候,会把这个字段定义成外键(Foreign Key referencing Users table)。

聪明的小伙伴总是爱问为什么,不设置成外键行不行?

外键是用来建立表之间关联关系的约束,作用是保证数据的完整性和一致性。

外键定义了表之间的引用关系,确保一个表中的值在另一张表中一定存在。

回到前边的问题,如果不设置成外键,会有什么影响?

  1. 无法保证值在另一张表中一定存在
  2. 没办法做到级联操作,需要自己处理级联关系的数据

第一点会导致出现脏数据,比如在订单明细表中填写一个不存在的订单编码,第二点是在删除订单的时候级联删除订单明细,如果没有外键,需要自己手动删除。

为什么很多公司禁止使用外键呢?背后隐藏着什么血与泪呢?

在阿里编码规范中强制禁止使用外键,应该把外键的逻辑关系放到应用层中。


阿里 Java编程规范

这是因为外键约束会降低数据库的性能,在对性能要求比较高的时候,相比较在应用层保证逻辑正确性的成本要低于使用外键。

课代表

外键(Foreign Key)是一种用来建立表与表之间关联关系的约束,用于保持数据完整性和一致性。

外键的作用有:

  1. 建立关联关系
  2. 保证数据的完整性和一致性
  3. 级联操作

本文主要讲了主键和外键的概念和作用,在工作中,对主键的接触可能比外键多,所以着重介绍了主键的类型选择。

相关推荐

实战python中Random模块使用(python中的random模块)

一、random模块简介Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。要在Python中使用random模块,只需要...

Python随机模块22个函数详解(python随机函数的应用)

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。平时数据分析各种分布的数据构造也会用到。random模块,用于生成伪随机数,之所以称之为伪随机数,是...

说冲A就冲A,这个宝藏男孩冯俊杰我pick了

爱奇艺新上架了一部网剧叫《最后一个女神》。有个惊人的发现,剧里男三居然是《青春有你》的训练生冯俊杰。剧组穷,戏服没几件,冯俊杰几乎靠一件背背佳撑起了整部剧。冯俊杰快速了解一下。四川人,来自觉醒东方,人...

唐山打人嫌犯陈继志去医院就医的背后,隐藏着三个精心设计的步骤

种种迹象表明,陈继志这帮人对处理打人之后的善后工作是轻车驾熟的,他们想实施的计划应该是这样的:首先第一步与伤者进同一家医院做伤情鉴定,鉴定级别最好要比对方严重,于是两位女伤者被鉴定为轻伤,他们就要求医...

熬夜会造成神经衰弱,别再熬夜了(熬夜会加重神经衰弱吗)

长时间熬夜会出现神经衰弱,皮肤受损,超重肥胖,记忆力下降等现象……熬夜了能补回来吗?每天少睡一两个小时算熬夜吗?必须上夜班怎么办?如何减少熬夜伤害?戳图转给爱熬夜的TA!via央视新闻来源:河北省文...

落叶知秋的图片爬取(落叶知秋的图片有哪些?)

importrequestsfrombs4importBeautifulSoupimporttimeimportjsonpathimportjsonfromurllib.parsei...

小心有毒!长沙海关查获藏匿在“巧克力威化涂层”中的大麻

来源:海关发布近日,长沙黄花机场海关对一票申报为“巧克力威化涂层”的进境快件进行机检查验时,在包裹内查获封装于各独立威化饼干包装袋中的大麻230克。另从其他申报为“巧克力、儿童早餐谷物”的快件中查获藏...

钧正平:编造传播这种谣言,荒谬(钧正公司)

来源:钧正平工作室官方微博【钧评编造传播这种谣言,荒谬!】目前,乌克兰安全形势还在迅速变化之中,各方面安全风险上升。相关事件网上热度极高,倍受瞩目。然而,有一些人却借机大肆制造散播一些低级谣言,比如...

幸运角色过去了,谈一谈DNF起源的元素

总的来说伤害比上个版本强太多了,打卢克每日和团本明显能感觉的到。目前打团B套+圣耀稍微打造下应该都能随便二拖了。组队基本上都是秒秒秒(以前得强力辅助,现在随便带个毒奶都行)。单刷除了王座和顶能源阿斯兰...

DNF元素超大凉打桩测试(把括号的伤害加起来好像比较正常)

最近修练场的二觉老是很奇怪,发现以前都是习惯性先减抗然后丢二觉,结果伤害。。。直接丢二觉就正常了下面是其他技能伤害,没达到BUG线,估计问题不大。装备打造方面:全身红字加起来353(41*5+74*2...

ANSYS接触和出图技巧(ansys rough接触)

1.ANSYS后处理时如何按灰度输出云图?1)你可以到utilitymenu-plotctrls-style-colors-windowcolors试试2)直接utilitymenu-plotctr...

ANSYS有限元使用经验总结-后处理(4)

28.求塑性极限荷载时,结构的变形应该较大,建议把大变形打开。...

CFopen21.1、CFopen21.2都来了(cfile open)

[呲牙][赞][加油]

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

取消回复欢迎 发表评论:

请填写验证码