如何选中并解除关联图片,删除多表中指定分类的所有关联数据
操作前务必做好相关表的数据备份,避免数据丢失
问题根因
你当前使用的是隐式内连接,逻辑等价于INNER JOIN,要求所有关联表都存在匹配的记录才会返回结果。如果该分类下的部分post没有关联的图片、评论或者标签,整条记录就会被过滤,因此返回空结果。另外你编写的SQL中额外关联了没有在需求中提到的comments表,也会进一步放大匹配不到的问题。
修复方案
1. 调整查询语句验证关联数据
改用左连接(LEFT JOIN)关联子表,保证只要是该分类下的post,无论是否有子表关联记录都会被返回:
SELECT c.catId, p.post_id, i.image_post_id, t.tag_post_id FROM categories c INNER JOIN posts p ON p.post_catId = c.catId LEFT JOIN images i ON i.image_post_id = p.post_id LEFT JOIN tags t ON t.tag_cat_id = c.catId AND t.tag_post_id = p.post_id WHERE c.catId = 25;
如果需要同时查看评论关联数据,可以额外加LEFT JOIN comments cm ON cm.comment_post_id = p.post_id。
2. 按依赖顺序执行关联解除/删除操作
操作前建议先把语句中的删除/更新逻辑换成SELECT,验证待操作的记录范围符合预期后再执行:
- 解除图片与post的关联(若仅需解除关联不需要删除图片):
UPDATE images i INNER JOIN posts p ON i.image_post_id = p.post_id SET i.image_post_id = NULL WHERE p.post_catId = 25;
- 若需要直接删除关联的图片记录:
DELETE i FROM images i INNER JOIN posts p ON i.image_post_id = p.post_id WHERE p.post_catId = 25;
- 删除关联的标签记录:
DELETE t FROM tags t WHERE t.tag_cat_id = 25;
- 删除该分类下的所有post:
DELETE FROM posts WHERE post_catId = 25;
- 最后删除目标分类:
DELETE FROM categories WHERE catId = 25;
内容的提问来源于stack exchange,提问作者user1805543
相关产品推荐
相关产品推荐

