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

时间:2011-09-03 07:26:55

标签: mysql sql cascading-deletes

愿有人帮助我。我正在尝试一些东西,但我(也)是(我的)SQL的新手。

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

我希望表格类别保持整洁。因此,如果项目中的项目不属于类别中的类别X,则应从类别中删除类别X.你是如何建立的。我通过使用DELETE ON CASCADE猜测,但到目前为止,当我从类别中删除类别时,它只删除了项目中的相应项目。

非常感谢帮助我!

1 个答案:

答案 0 :(得分:43)

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

  • 表A中有一行
  • 表B中有一行引用表A中的行
  • 删除表A中的行
  • 数据库删除表B中的相应行

所以你有物品,每件物品都属于一个特定的类别。在您的项目表中,您有一个category_id(请修改您的拼写),它引用了类别表中的一行。所以,在你的情况下:

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

你所要求的是另一种方式:

  • 你有物品
  • 删除特定类别中的最后一项
  • 数据库转到并找到该类别并将其删除

由于两个原因,无法使用ON DELETE CASCADE执行此操作:

  1. 在插入第一个项目之前,如何创建一个空类别?数据库必须立即删除它。
  2. 数据库必须在扫描表格时进行大量额外工作。它不“知道”项目#23082是该类别中的最后一项;它必须以某种方式跟踪该类别中的项目数量。
  3. 这一切都源于ON DELETE CASCADE维护参照完整性的一种方式。也就是说,这是数据库为您提供强有力保证的一种方式,如果您在项目#9847上看到类别#20393,当您去寻找类别#20393 时,您知道它存在是省力的设备。 :)这就是为什么其他选项是ON DELETE SET NULLON DELETE RESTRICT:它们也保证完整性,但它们不会删除,而是删除不良引用或阻止原始删除。

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