gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:36:39 26 4
gpt4 key购买 nike

请有人帮帮我。我正在尝试一些东西,但我对(我的)SQL (太)陌生。

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

我希望表格类别保持整洁。因此,当 Items 中没有商品属于 Categories 中的类别 X 时,应从类别中删除类别 X。你如何确定这一点。我猜测是在 CASCADE 上使用 DELETE,但到目前为止,当我从 Categories 中删除一个类别时,它只是从 Items 中删除相应的项目。

非常感谢您帮助我!

最佳答案

ON DELETE CASCADE 是一种在删除行引用的行时删除行的方法。这意味着:

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

所以你有项目,每个项目都属于一个特定的类别。在您的 items 表中,您有一个 category_id(请修正您的拼写),它指的是 categories 表中的一行。所以,在你的情况下:

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

你要求的是另一种方式:

  • 您有元素
  • 您删除了特定类别中的最后一项
  • 数据库找到该类别并将其删除

ON DELETE CASCADE 无法做到这一点,原因有二:

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

这一切都源于 ON DELETE CASCADE 是一种维护参照完整性的方式。也就是说,这是数据库向您提供强有力保证的一种方式,即如果您在项目 #9847 上看到类别 #20393,当您查找类别 #20393 时您知道它存在。它不是省力设备。 :) 这就是为什么其他选项是 ON DELETE SET NULLON DELETE RESTRICT 的原因:它们也保证完整性,但不是删除,而是删除错误引用或阻止发生原始删除。

所以答案是,如果您担心空类别,您将不得不编写一个 cron 作业来定期清理该表或使用某种 ON DELETE 触发器。

关于mysql - 如何在多对一关系上使用 DELETE ON CASCADE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291773/

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