不需要级联时的外键

时间:2013-03-25 13:47:55

标签: mysql sql foreign-keys

如果我不需要在逻辑上为cascade的字段中使用restrict / foreign key和类似约束,我是否有任何理由明确声明它为foreign key cascade,除了美学?

它不会实际降低性能,因为它必须测试完整性吗?

编辑:澄清,我不需要它,因为:

  • 我不会编辑或删除这些值,所以我不需要INSERT和类似的检查
  • 在致电restrict之前,我会检查目标密钥是否存在,所以我不需要{{1}}检查

据我所知,这种约束将确保如果数据库以某种方式损坏,该关系仍然有效,这是一件好事。但是,我想知道在我的情况下是否还有其他原因可以使用此功能。我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

this quesiton的答案实际上也可能适用于您的问题。

如果表中有列引用其他表中的行,则应始终使用外键,因为即使您认为“不需要”这些检查提供的功能,它仍将有助于保证数据完整性如果您忘记检查自己的代码。

在大多数情况下,外键检查的性能影响是可以忽略的(参见上面的链接),因为关系数据库使用非常优化的算法来执行它们(毕竟,它们是一个关键特性,因为它们实际上定义了实体之间的关系)

FK的另一个主要优势是它们还可以帮助其他人理解数据库的布局。

修改 由于上面链接的问题是指SQL-Server,这里有一个对MySQL非常相似的回复:Does introducing foreign keys to MySQL reduce performance

答案 1 :(得分:2)

你必须这样做。如果它会在写入时触及性能 - 这是一个“像素”问题。

主要性能问题正在阅读中 - FK可以帮助查询优化器选择最佳计划等。即使您的DBMS(-s)(如果您提供跨DBMS解决方案)将从中获益 - 它可能发生后面。

所以回答是 - 是的,这不仅仅是aestetics。