ON DELETE CASCADE是一种在删除其引用的行时删除该行的方法。这表示:
- 您在表A中有一行
- 您在表B中有一行引用了表A中的一行
- 您删除表A中的行
- 数据库删除表B中的对应行
因此,您拥有项目,并且每个项目都属于一个特定的类别。在您的项目表中,您有一个category_id(请纠正拼写),它指向categorys表中的一行。因此,在您的情况下:
- 你有一个类别
- 您有一个引用类别的项目
- 您删除类别
- 数据库删除与该类别对应的所有项目
您要的是另一种方式:
- 你有项目
- 您删除特定类别中的最后一个项目
- 数据库开始查找该类别并将其删除
无法使用进行此操作
ON DELETE CASCADE,原因有两个:
- 在将第一个项目插入其中之前,您将如何创建一个空类别?数据库将必须立即将其删除。
- 数据库将不得不做很多额外的工作来扫描表。它不“知道”项目#23082是类别中的最后一个项目。为此,必须以某种方式跟踪类别中的项目数。
这一切都源于这样
ON DELETE CASCADE一种事实,即 保持参照完整性的
一种方式。也就是说,这是数据库为您提供强烈保证的一种方式,即如果您在项目#9847上看到类别#20393,则在转到类别#20393 时就知道它存在 。它
不是 节省劳力的设备。:)这就是为什么其他选项分别是
ON DELETE SET NULLand的原因
ON DELETERESTRICT:它们还保证完整性,但它们不会删除,而是删除了错误的引用或阻止了原始删除的发生。
因此答案是,如果您担心空类别,则必须编写cron作业来定期清理该表或使用某种ON DELETE触发器。



