为什么在MySQL中使用外键约束?

55

我在思考,

如果我能确定添加的类型,那么使用MySQL中的约束作为外键的动机是什么?

它会提高性能吗?


2
类似的问题已经有答案了,请参考 https://dev59.com/23I-5IYBdhLWcg3wZ3YR,那里有很多讨论:D - Andy Lin
2个回答

77

外键强制引用完整性。这些约束条件保证了一个表order_details中的一行,其中一个字段order_id引用了一个orders表,将永远不会有一个order_id值不存在于orders表中。

虽然在使用关系型数据库时不需要外键(事实上MySQL的默认存储引擎不支持FKs),但它们绝对是避免破碎的关系和孤立行(即引用完整性)所必需的。在数据库层面上执行引用完整性的能力是使ACID中的C成立所必需的。

至于您对性能方面的担忧,通常会有一些性能成本,但可能会非常小。我建议您放置所有的外键约束,并且只有在您无法通过其他方式解决实际性能问题时才尝试不使用它们。


4
有没有不使用外键约束的好理由?我曾经使用过多种 PHP 框架,从未需要使用它们。我认为应用程序应该处理和防止孤儿记录,而不是依赖于外键约束。能否有人给我解释一下? - Angel S. Moreno
3
有点像问“有没有不使用垃圾回收器的理由?”只是在这种情况下,通过自己管理此类数据库垃圾,您不会获得性能提升,相反地,执行所有必需查询以保持外键关系一致不仅极易出错,而且极其低效。 - thesaint
11
唯一不使用FK的好理由是当您不需要一致性时。 - thesaint
6
是的,有不使用FK约束的好理由。我认为最明显的一点是,你可能会同时锁定多行,这可能会产生意想不到的后果。我们曾经在这里无意中这样做过,我们经常发现数据库变得缓慢并且对某些记录完全冻结。请阅读此文章:https://www.percona.com/blog/2010/10/25/impact-of-the-sort-buffer-size-in-mysql/ - John Hunt
1
另一个困难是如果您想要重命名表,而不更新对其的外键引用。 - Adam Millerchip

0
一个原因是带有外键约束的表集合无法分片到多个数据库中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接