首页 > 解决方案 > 您可以对 MySQL 或任何数据库中的外键没有或弱约束吗?

问题描述

我知道大多数数据库将外键约束设置为“SET NULL”、“CASCADE”、“NO ACTION”或“RESTRICT”。默认值通常是 No Action,这意味着删除操作将被回滚。

如果我想要一个“松散”或“弱”的参考怎么办?也就是说,如果链接存在,那就太好了!如果没有,谁在乎,让它打破!

我在尝试为健身应用程序设计我的第一个数据库时遇到了这个问题,该应用程序包含许多用户创建的自定义练习。任何其他用户都可以使用这些自定义练习。

比如说:

  1. 用户 A 创建练习 A。
  2. 用户 B 记录练习 A。
  3. 用户 A 删除了练习 A。
  4. UserB 保留ExerciseA 的日志,但不能引用ExerciseA 本身,因为它已被删除。

这种情况类似于可以删除视频的 Youtube 播放列表,它将显示为断开的链接 - 这是预期的行为。不需要参照完整性。播放列表的项目本身存在并需要父视频,但该视频不再存在。

“On delete set null”似乎是这里的最佳选择,但我需要将ExerciseID 保留在Log 表中,因为它用作复合键的一部分(练习日志由UserID、ExerciseID 和时间戳唯一标识)。不要完全使用外键和约束?我不知道这里的最佳做法是什么。帮助!

标签: mysqldatabase

解决方案


经过一番研究,简短的回答是“不”。如果不强制执行其引用完整性,就不能拥有外键。它首先破坏了拥有外键的整个目的,该外键管理着一条信息必须存在于数据库中的规则。

好吧,我不想要参照完整性,所以我不需要外键!我什至会说并非所有关系都需要参照完整性。一本好书让我对这个概念放心:https ://ardalis.com/related-data-without-foreign-keys/


推荐阅读