gpt4 book ai didi

mysql - 外键是否总是需要有约束?

转载 作者:搜寻专家 更新时间:2023-10-30 20:08:29 25 4
gpt4 key购买 nike

我知道这是一个奇怪的问题,因为我一直被教导使用外键约束。但是,我遇到过这样一种情况,当引用被删除时,必须保留外键引用值以用于历史目的。

它是一个任务管理系统,任务发生引用包含重复规则的父任务。可以删除此父任务,但事件本身必须与不存在的父 ID 保持一致。如果找不到父任务,系统只会返回一个错误——例如“父任务不再存在”。 parent id 不能在 cascade 上设置为 null 的原因是因为它在出现的其他地方用作标识键。

另一个例子:从播放列表中删除的 YouTube 视频怎么办。类似的情况吧?它在播放列表中被引用,但视频不存在,因此它在播放列表中返回错误。

我是否根本不定义外键,只是简单地将 parent_id 引用列创建为普通列?我只是想确定当遇到一个表引用另一个表但前者不受后者存在的约束时通常如何处理。

最佳答案

拥有约束只是一个技术助手,可以强制执行为数据库定义的语义,即“此列包含一个数字,该数字不仅是 INTEGER(32),而且还是记录的标识符在其他一些表中”。因此,它们不是绝对必要的,但它:

  • 明确该领域的意图( self 记录)
  • 通过防止插入不正确的数据来保持您的数据“干净”
  • 向数据库引擎提供有关表内容的提示,这可以使数据库更高效地执行。

就是说,完成您所描述的内容的“正确”方法首先是不要物理删除父记录。相反,将父级标记为已删除。由于您出于历史目的保留记录,因此您肯定希望能够知道父项曾经是什么,即使它不再有效或不再有效。

第二个选项是创建一个虚拟的“父记录已删除”引用。每当您删除父项时,您都会更新剩余的引用以指向虚拟记录。至少您不会依赖错误来实现预期和有效的行为。

最后,我看不出有什么理由不能将外键设置为 NULL。听起来您正在使用外键作为相关记录的主键的一部分(“正在使用 .. 作为识别键”)。你几乎肯定不应该这样做,如果这是问题的根本原因,请从改变它开始。

关于mysql - 外键是否总是需要有约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38561844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com