MySQL中ON DELETE CASCADE不生效:删除tags_files未触发files表删除?
这事儿其实是你搞反了外键ON DELETE CASCADE的作用方向啦,我给你拆解清楚:
首先看你定义的外键约束:
CONSTRAINT FOREIGN KEY (`file_id`) REFERENCES `files` (`id`) ON DELETE CASCADE
这个约束是挂在tags_files表的file_id字段上,指向files表的id主键。这里的ON DELETE CASCADE的意思是:当父表(也就是被引用的files表)中的某条记录被删除时,子表(tags_files)里所有关联这条记录的条目会被自动级联删除——而不是反过来!
举个实际场景的例子:
- 如果你执行
DELETE FROM files WHERE id = 'xxx',那么tags_files表中所有file_id = 'xxx'的记录会被自动删掉,这才是这个级联规则的作用场景。 - 但你现在是删除
tags_files里的记录,这属于操作子表,外键约束不会触发父表的删除动作——毕竟一个文件可能对应多个标签关联,删除其中一个标签关联就删掉文件,显然不符合常规的业务逻辑,MySQL也不会默认支持这种反向级联操作。
如果你的需求是想删除某个标签关联时同时删除对应文件,那这种逻辑不能靠外键约束实现,得自己写业务逻辑(比如先删tags_files的关联记录,再手动删除files里对应的条目),不过这种操作要谨慎,避免误删文件。
内容的提问来源于stack exchange,提问作者eldios1981
相关产品推荐
相关产品推荐

