mysql为何不建议使用外键

MySQL中不建议使用外键的原因包括性能问题、外键设计限制、对拓展性的制约以及可用的逻辑外键解决方案。外键虽能保证数据一致性,但可能导致性能下降,且在热更新和分布式系统中可能造成不便。业界倾向于使用逻辑外键和程序控制来实现数据关联,以平衡性能和数据完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

优快云首页
博客
课程
文库·商城
问答
社区
插件
认证
开源
mysql为何不建议使用外键
搜索

会员中心
足迹
动态
消息
创作
mysql为何不建议使用外键_为什么很多mysql课程不推荐用物理外键?

大机灵聪明绝顶

于 2021-01-18 21:21:46 发布

1408
收藏
文章标签: mysql为何不建议使用外键
版权
刚好今晚有师弟问我这个问题,就来搜搜。以前我对这个也是蛮困惑的。这一年来对这个问题感受比较深。

用外键的好处我就不多说了,既然是关系型数据库,外键的约束为我们保证了数据主从关系和产生的先后关系,级联操作为我们的update和delete带来了不少方便。但成本是有的,你要权衡你是不是想付出这些代价。成本参考以下几点:

1.外键的性能问题

我刚写了一些,然后发现有人写的更好而且简洁,就引用吧:@mysqlops为何说外键有性能问题:

1.数据库需要维护外键的内部管理;

2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;

3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;

4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

作者:mysqlops

链接:https://www.zhihu.com/question/19600081/answer/13295957

来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总的来说物理外键是个比较“重”的实现,他会不顾性能不分轻重缓急的给你保证一致性。

2.mysql的外键设计问题

虽然很多人都不推荐你在关系型数据库使用外键。 但你更多听到的是mysql的,而不是SQLserver或者其他。比较公认的是,他的外键设计得的确不是很好,限制多功能不强大等,以innodb 为例子,包含但不限于以下几点(我认为比较严重的)所有tables必须是InnoDB型,它们不能是临时表。

在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。

不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中,这是因为对这些列的索引必须总是包含一个前缀长度

InnoDB不对那些外键或包含NULL列的被引用键值检查外键约束

印象中轮子哥 @vczh 在回答一个跟存储过程有关的问题提到过,其他数据库不建议使用存储过程那是因为他们设计的不好,银行内不都比较推荐甚至要求sqlserver使用存储过程么(你没骗我吧)。反正我以前也是用sqlserver的,我觉得是挺好的。

3.外键对拓展性的限制和影响

外键的主从关系是定的,然后你会遵守这个规矩去干活。但是计划赶不上变化,万一哪天主键所在表需要拆分了呢?需要重构了呢?万一哪天你突然发现外键表不是非得跟主表的主键挂上关系呢?就我经历过的来看,这种情况并不少见,尤其是数据库设计者水平不够高的情况下。

另一方面,数据库帮你保证级联关系,你平时写程序的时候就真的思路清晰吗?因为某些原因(比如你想要的关系数据库不支持,mysql经常),有些地方你就不能设计外键了,当有级联更新的需要时,一部分靠物理外键,一部分还得靠自己,我觉得还不如全靠代码逻辑去保证。即使你对业务理解深刻,对外键也掌握的透彻,你也不太希望老是你管一部分他管一部分吧?

再放个大招,当你需要分库分表的时候,外键就浮云了。

4.逻辑外键在业界比较成熟

外键是个好东西,不使用物理外键,我们也可以约定逻辑外键(不在数据库声明FK,在程序实现上表达关联)

数据库上的策略:可以选择大多数情况下我们只更新不删除,也就是逻辑删,不再使用的历史数据定期归档来减少压力。

代码的设计和限制:对表范围的操作权限,开启事务去处理逻辑,有需要进行异步操作来提高性能的我们设计补偿机制去弥补,等等。

有人问原本在物理外键的开销,在程序上不也有开销吗。但是这样我们对优化性能的方式也灵活了,刚刚说的异步处理就是一种。视具体情况而定,如果设计的好,有时候某些“脏数据”你不是非得立刻删除他,甚至不是非得删除他。对于正确性>性能的说法,如果逻辑复杂到一定程度,物理外键一定能给你提供正确性吗?这个可以讨论讨论。

最后,

来多点传送门,因为老觉得想探讨一个问题在一个帖子里能看到的太窄了。大家设计数据库时使用外键吗?​www.zhihu.comzhihu-card-default.svg数据库删除记录,是直接物理删除好,还是伪删除好?​www.zhihu.comzhihu-card-default.svg在数据库中具体创建表结构的时候,需要创建外键吗?​www.zhihu.comzhihu-card-default.svgSQL Server 和 Oracle 以及 MySQL 有哪些区别?​www.zhihu.comzhihu-card-default.svg

其他的知乎上好像还有好几个类似问题,不过没什么人答,大家怎么老是问人家问过的啊。。。

最后是我把这个整理成了帖子

相关资源:MySQL删除表的时候忽略外键约束的简单实现_mysql如何取消外键约束…

大机灵聪明绝顶
关注

2

0

0
打赏

数据库外键为什么被抛弃了?
软件老王
182
1、背景 其实这个话题是老生常谈,很多人在工作中确实也不会使用外键。包括在阿里的JAVA规范中也有下面这一条: 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 但是呢,询问他们原因,大多是这么回答的: 每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。 坦白说,这么说也是对的。但是呢,不够全面,所以开一文来详细说明。 2、正文 首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证表间数据的关系“始终完整”。因此,外键约束的存在,并非全
参与评论

请发表有价值的评论, 博客评论不欢迎灌水,良好的社区氛围需大家一起维护。

表情包
表情包
MySQL - 不使用外键约束的实操(二)_程序员牧码的博客
3-21
MySQL - 不使用外键约束的实操(二) 互联网开发中不用外键到底是个什么意思? 都说互联网开发尽量不用外键,那么这里的不用外键到底代表的啥意思呢? 1. 这里有一层意思很明确: 不用外键约束。比如删除一张表中的数据时,如果要级联…
MySQL 不用外键的话,如何让表起来关联呢?_weixin_34006…
4-2
MySQL 不用外键的话,如何让表起来关联呢? 2019独角兽企业重金招聘Python工程师标准>>> 最近在设计一个户外APP的数据库,在外键设计上有点纠结,用还是不用,考虑了再三,还是不用, 那么如何表之间的关联了。只能在字段名上做文章了。
MySQL——不使用物理外键的原因
Lutra的博客
223
1、性能 使用物理外键会使得数据库性能下降,并发能力下降 2、热更新 分布式的项目,绝大多数都需要热更新的,热更新就是不停机去进行维护。不管是互联网产品,还是一些游戏手游。大多都会采用热更新的方式。如果数据库有外键,可能会造成新更新的代码 无法运行。 因为要匹配现有的外键,可能要重启服务器。那么这样就达不到热更新的目的了。因为外键是强力执行的。注意点和分布式绝对是冲突的。 3、耦合度 去…
mysql为啥不能用外键_为什么在MySQL数据库中无法创建外键
weixin_29016315的博客
186
展开全部一般情况下32313133353236313431303231363533e78988e69d8331333361326338,mysql是不赞成用外键的,因为这个完全可以用php等服务器脚本语言组织一些功能达到目的…如果 你一定要用,例子,简单演示一下使用,做dage和xiaodi两个表,大哥表是主键,小弟表是外键:建表1CREATETABLEdage(2id
mysql为何不建议使用外键_MYSQL外键的使用以及优缺点…
3-13
2,用外键要适当,不能过分追求 3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。 需要注意的是:MySQL允许使用外键,但是为了完整性检验的目的,在除了InnoDB表类型之外的所有表类型中…
mysql是否需要设置外键_数据库到底需不需要设置外键?_m…
3-11
(1)所有外键的约束,需要自己在逻辑层自己实现; (2)会出现数据错误覆写,错误数据进库的情况; (3)消耗了服务器的性能; (4)业务层里夹带持久层特性,耦合; 总结: 1.互联网行业:不推荐使用外键。
mysql sql外键的作用_为什么实际开发中不使用外键
weixin_39621178的博客
555
背景上学的时候,大家肯定都学习了数据库相关的课程,MySQL和Oracle中都有外键。但是自从开始工作,我就发现一个奇怪的问题,企业实际开发中,表结构定义都不会用数据库的外键,当需要用外键做关联的时候,也是仅对字段进行冗余存储,不会用foreign key的定义,究竟有哪些考量呢?此篇做个总结。外键什么是外键两张表有关联关系,才会涉及外键的概念。举例 商品表(商品id、商品名称),订单表(订单id…
mysql数据库 外键设计的优缺点 - 个人见解
ailice001的博客
7551
mysql设置外键的好处阻止执行 从表插入新行,其外键值不是主表的主键值便阻止插入; 从表修改外键值,新值不是主表的主键值便阻止修改; 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行); 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。级联执行 主表删除行,连带从表的相关行一起删除; 主表修改主键值,…
MySQL中尽量少使用外键的原因_abigpineapple的博客
3-21
MySQL中尽量少使用外键的原因 mysql设置外键的好处 阻止执行 从表插入新行,其外键值不是主表的主键值便阻止插入; 从表修改外键值,新值不是主表的主键值便阻止修改; 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先…
mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义
weixin_42452580的博客
140
1,创建表时加入的约束a)非空约束,not nullb)唯一约束,uniquec)主键约束,primary keyd)外键约束,foreign key1,非空约束,针对某个字段设置其值不为空,如:学生的姓名不能为空drop table if existst_student;create tablet_student(student_idint(10),student_namevarchar…
mysql是否推荐使用外键_MySQL 外键使用
weixin_30135925的博客
318
MySQL 外键使用外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;外键…
【数据库外键】为什么不推荐使用物理外键?
corleone_4ever的博客
573
目录 一、外键使用场景 二、为什么不使用物理外键 1.参考阿里手册 2.物理外键的优点 3.物理外键的缺点 三、总结 一、外键使用场景 今天测试员测出来许多bug,是由于未解决外键关系照常的我问题. A表的id是B表的外键,业务上B表通过外键关联A表获取A表的name A表删除后,B表无法获取到name 通过加逻辑外键来解决了这个问题 二、为什么不使用物理外键 1.参考阿里手册 2.物理外键的优点 保证数据的完整性和一致性 级联操作方便 将数据完整性判断托付给…
【原创】数据库中为什么不推荐使用外键约束
weixin_30312659的博客
2131
引言 其实这个话题是老生常谈,很多人在工作中确实也不会使用外键。包括在阿里的JAVA规范中也有下面这一条 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 但是呢,询问他们原因,大多是这么回答的 每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。 坦白说,这么说也是对的。但是呢,不够全面,所以开一文来详细说明。 正文 首先我们明…
MySQL - 不使用外键约束的实操(二)
牧码的博客
807
互联网开发中不用外键到底是个什么意思? 都说互联网开发尽量不用外键,那么这里的不用外键到底代表的啥意思呢? 1. 这里有一层意思很明确: 不用外键约束。比如删除一张表中的数据时,如果要级联删除另一张表中关联的数据,以往是由数据库来级联约束的,现在应该将其移到程序中由程序来保持数据的一致性。 2. 另外一层意思: 外键的定义就是在一个表中的字段是另外一张表中的主键。如果仅按照"不使用外…
mysql 逻辑外键的设置
qq_16069927的博客
3638
本博客转载自 https://www.jianshu.com/p/ab58fa7e8146 本博客字体标红部分为设置外键的SQL语句 1.假如我们现在有个这样的需求,我们公司有以下几个部门,“研发部”,“产品部”,“运维部”,当有新员工进入的时候,需要只能加入以下三个部门的某个部门,没有列表所示的部门将不能加入,这个时候,我们可以用到外键 我们来创建两个表,create table …
MYSQL外键的使用以及优缺点
u010695055的专栏
9102
主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作, 矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。 正方观点: 1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性
mysql一对多究竟用还是不用外键_不使用外键,尝试多对多查询
weixin_31597759的博客
835
我的上两篇博客总结了一下不使用外键的优缺点但是我还没试过,今天尝试了一下,用难一点的多对多关系实验一:工具:springbootmybatismysql二:材料:五张表:user–用户表role–角色表permission–权限表user-role表permission-role表其中,user-role表和permission-role表是意义上的中间表,就是没有外键的,其他三张是基本表s…
mysql外键约束 弊端_记一个Mysql外键约束设计缺陷
weixin_35932973的博客
291
记一个Mysql外键约束设计缺陷背景信息最近在做项目的数据库迁移,从Oracle到Mysql,一个外键约束在Oracle运行正常,在mysql报异常。(因为才接手没几天,对业务和框架不熟,在处理问题时花了很多时间。)[2018-08-01 13:34:19] [23000][1452] Cannot add or update a child row: a foreign key constrai…
mysql 外键性能_关于,在Mysql中,外键是否会影响性能的问题???
weixin_33729662的博客
670
In MySQL, a foreign key requires an index. If an index already exists, the foreign key will use that index (even using the prefix of an existing multi-column index). If no index exists, defining the f…
MySQL之为什么不建议使用外键约束
最新发布
u800820的专栏
132
接上篇短文中提到我们项目中不会设置外键,这里简单谈下原因。 外键的优点 外键能够保证数据的一致性和完整性,通过设置外键,数据库就会判断数据的完整性,不需要在应用代码里实现。 外键的缺点 性能问题 比如table_a和table_b通过外键关联,当往table_a插入数据时,数据库就会去查询外键关联的table_b里面有没有对应数据,没有对应数据是没法入库成功的。同时,在大数据量入库的情况下,每次入库都需要先查询会导致性能瓶颈。 因此,阿里巴巴Java开发手册里建议,不得使用外键与级联,一切外键概念必须在应
MySQL数据库为什么不推荐使用外键约束?
qq_44829938的博客
311
阿里巴巴的Java开发手册中有这样一句话: 不得使用外键与级联,一切外键概念必须在应用层解决! 以student和grade的关系为例 ,student中的student_id是主键,成绩表中的student_id则为外键 ! 先了解一下什么叫级联更新和级联删除! 当在student表中要删除或者更新student_id=20的相关信息,马上在grade表中中查找是否有student_id=20这个记录,然后进行删除或更新,这就叫级联。 外…
mysql 外键_为什么大多数互联网公司不用外键约束
weixin_39645343的博客
139
是否使用外键约束【强制】不得使用外键与级联,一切外键概念必须在应用层解决.-《阿里Java规范》首先外键(Foreign Key)是什么东西使用方案假设有一个score表 id是自增id,score是分数,student_id是学号。另一个student表,id是自增id,name是名字,student_id是学号。那么设计这个的时候就希望有一个关联关系,让score的student_id指向st…
“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助
©️2022 优快云 皮肤主题:深蓝海洋 设计师:优快云官方博客 返回首页
关于我们
招贤纳士
商务合作
寻求报道

400-660-0108

kefu@youkuaiyun.com

在线客服
工作时间 8:30-22:00
公安备案号11010502030143
京ICP备19004658号
京网文〔2020〕1039-165号
经营性网站备案信息
北京互联网违法和不良信息举报中心
家长监护
网络110报警服务
中国互联网举报中心
Chrome商店下载
©1999-2022北京创新乐知网络技术有限公司
版权与免责声明
版权申诉
出版物许可证
营业执照

大机灵聪明绝顶
码龄3年
暂无认证
82
原创

周排名
90万+
总排名
4万+
访问

等级
58
积分
5
粉丝
6
获赞
0
评论
30
收藏
勤写标兵Lv2
私信
关注
搜博主文章

热门文章
arcgis里面怎么截图_怎么利用ARCGIS裁剪图像 4303
内存颗粒位宽和容量_最全的内存颗粒编码规则说明,教你看穿内存条到底用的什么颗粒… 2391
msconfig蓝屏_电脑msconfig改动后蓝屏怎么修复 2309
onlyoffice开发java_OnlyOffice功能及演示 2173
普通话测试第四题评分标准_普通话机测培训切中考生痛点(四)说话题评分标准及注意事项… 1925
您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

最新文章
jquery ajax safari,jquery - Safari browser ajax request error - Stack Overflow
读取db服务器信息出错,尝试读取foxpro dbf并获取错误:无法初始化链接服务器的OLE DB提供程序“MSDASQL”的数据源对象“(空)”…
win7系统服务器上的要求吗,win7和win10哪个对硬件要求高_网站服务器运行维护
2021年131篇2020年27篇

举报

MySQL可以添加,但是需要满足一些条件。首先,MySQL的存储引擎必须是InnoDB,因为只有InnoDB引擎支持约束。如果你的表使用的是其他存储引擎,如MyISAM,那么就无法添加。其次,你需要确保表之间的关联字段的数据类型和长度完全一致。另,如果你要添加约束,被引用的表必须有一个主或者唯一索引。如果你的表满足这些条件,就无法添加约束。所以,如果你无法添加,可能是因为你的表使用的是支持的存储引擎,或者表之间的关联字段满足约束的条件。\[1\]\[2\]另,虽然MySQL支持,但是有些人推荐在关系型数据库中使用,因为MySQL功能相对较弱,限制较多,如其他数据库如SQL Server等功能强大。\[3\] #### 引用[.reference_title] - *1* *2* [MySQL数据库能添加的原因和解决办法](https://blog.youkuaiyun.com/qq_51533157/article/details/120680354)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [mysql为何建议使用](https://blog.youkuaiyun.com/qq_40631247/article/details/124141073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值