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

Bar*_*ber 9 mysql sql cascading-deletes

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

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

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

非常感谢帮助我!

Dan*_*ons 44

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

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

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

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

你要求的是另一种方式:

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

ON DELETE CASCADE由于两个原因,没有办法做到这一点:

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

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

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

  • 如果可以,我会给+10.这么好的答案. (2认同)