小编典典

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

sql

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

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

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

非常感谢您的帮助!


阅读 176

收藏
2021-03-23

共1个答案

小编典典

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触发器。

2021-03-23