当前位置: 首页 > 面试题库 >

如何在多对一关系上使用DELETE ON CASCADE

虞华彩
2023-03-14
问题内容

可以有人帮我。我正在尝试某些东西,但是对(my)SQL不熟悉。

我使用两个表:项目和类别。表项目有一个带有外键的字段:category_id。

我希望表类别保持整洁。因此,如果“项目”中没有任何项目属于“类别”中的X类别,则应从“类别”中删除类别X。您如何确定这一点。我通过使用DELETE ON
CASCADE进行猜测,但是到目前为止,当我从“类别”中删除类别时,它只是从“项目”中删除相应的项目。

非常感谢您的帮助!


问题答案:

ON DELETE CASCADE是一种在删除其引用的行时删除该行的方法。这表示:

  • 您在表A中有一行
  • 您在表B中有一行引用了表A中的一行
  • 您删除表A中的行
  • 数据库删除表B中的对应行

因此,您拥有项目,并且每个项目都属于一个特定的类别。在您的项目表中,您有一个category_id(请纠正拼写),它指向categorys表中的一行。因此,在您的情况下:

  • 你有一个类别
  • 您有一个引用类别的项目
  • 您删除类别
  • 数据库删除与该类别对应的所有项目

您要的是另一种方式:

  • 你有项目
  • 您删除特定类别中的最后一个项目
  • 数据库开始查找该类别并将其删除

无法使用进行此操作ON DELETE CASCADE,原因有两个:

  1. 在将第一个项目插入其中之前,您将如何创建一个空类别?数据库将必须立即将其删除。
  2. 数据库将不得不做很多额外的工作来扫描表。它不“知道”项目#23082是类别中的最后一个项目。为此,必须以某种方式跟踪类别中的项目数。

这一切都源于这样ON DELETE CASCADE一种事实,即 保持参照完整性的
一种方式。也就是说,这是数据库为您提供强烈保证的一种方式,即如果您在项目#9847上看到类别#20393,则在转到类别#20393 时就知道它存在 。它
不是 节省劳力的设备。:)这就是为什么其他选项分别是ON DELETE SET NULLand的原因ON DELETE RESTRICT:它们还保证完整性,但它们不会删除,而是删除了错误的引用或阻止了原始删除的发生。

因此答案是,如果您担心空类别,则必须编写cron作业来定期清理该表或使用某种ON DELETE触发器。



 类似资料:
  • 作为这个问题的一个例子,让我使用电视节目、电影和演员。每个电视节目和电影都有多个演员,每个演员都在一个或多个电视节目和/或电影中。如果我在他们之间建立一个多态的多对多关系,我似乎可以分别查询一个演员的所有电视节目和所有电影,但尽管我可以用谷歌搜索,我还没有找到一种方法来查询一个演员的所有电视节目和/或电影在一个集合中的联合。这难道不是多对多多态关系的有用之处吗? 如果事实证明这确实是可能的,我可能

  • 用户表结构:用户 id、名称、用户名、密码、创建时间、更新时间 文章表结构:文章 id、标题、内容、创建时间、更新时间 关系表:文章\用户 id、文章id、用户id处于活动状态、创建时间、更新时间 标签 id、名称、用户id、创建时间、更新时间 透视表项目用户与标记的关系。表:文章\用户\标签 标签号,物品号,用户号 我想连接这些表,以便可以像这样或类似的格式访问 并且应该能够创建/更新smth,

  • 问题内容: 这是情况:- 我有一个名为“用户”的表。由于所需的大多数数据是相同的,因此它包含学生和导师的用户数据。 完成该系统后,现在我被告知客户希望能够将学生分配给导师。 是否可以通过链接表在一个表内创建一对多关系的合法/干净方法? 我已经尝试过考虑这一点,但是我想出的任何解决方案似乎都是混乱的。 我将不胜感激。 谢谢 菲尔 问题答案: 您是否尝试过以下方法? 例如,创建一个新表(如果需要,请选

  • 问题内容: 我现在正在定义Django模型,我意识到模型字段类型中没有。我确定有办法做到这一点,所以我不确定我缺少什么。我基本上有这样的事情: 在这种情况下,每个可以有多个,但这种关系应该是单向的,因为我不需要从知道其拥有它本身,因为我可能有许多不同的对象自身的情况下,如为例: 我将用模型中的什么替换(不存在)以表示这种关系?我来自Hibernate / JPA,在这里声明一对多关系非常简单: 如

  • 我需要在Firestore上建立多对多关系模型。以下是对这些要求的总结。 > 一家公司可以为一个项目雇佣许多承包商。承包商可以在不同的时间为多家公司的不同项目工作。 承包商或公司的数量不应受到限制,即应使用集合或子集合。 承包商应能够按公司进行查询;反之亦然,公司应该能够通过承包商进行查询。例如,(1)承包商可能要求提供他/她工作过的公司的清单,并按项目排序 就公司而言,承包商可以改变状态,例如工