MySQL/Hibernate/JPA单查询删除多表数据返回0行受影响求助
问题原因
- INNER JOIN 匹配限制:INNER JOIN 要求所有关联的表都存在符合关联条件的记录时,才会生成有效的结果集。只要
applied_positions、feedback、answeer中任意一张表没有对应user_id和position_id的匹配记录,整个关联结果就为空,自然不会删除任何数据。 - 参数或基础数据缺失:占位符
?传入的user_id、position_id值不正确,或者report表本身就不存在对应这两个参数的记录,也会导致没有数据可删。 - 命名拼写错误:语句中的表名
answeer拼写疑似有误(通常正确拼写为answer),如果实际表名/字段名和语句中的拼写、大小写不匹配,也会导致关联失败返回空结果。 - 如果执行时没有报错仅返回0行,可排除MySQL安全更新模式的影响,安全模式触发时会直接抛出错误而非返回0行影响。
解决方法
- 第一步:先验证匹配结果,将DELETE语句改为查询语句执行,确认是否存在匹配记录:
SELECT COUNT(*) FROM report r INNER JOIN applied_positions ap ON r.position_id=ap.position_id AND r.user_id=ap.user_id INNER JOIN feedback f ON r.position_id=f.position_id AND r.user_id=f.user_id INNER JOIN answeer a ON r.user_id=a.userID AND r.position_id=a.position WHERE r.user_id=你的参数值 AND r.position_id=你的参数值;
如果返回结果为0,说明确实没有符合当前关联条件的记录。
- 第二步:按需替换为LEFT JOIN实现部分匹配删除,如果你希望只要
report表存在对应记录就删除report的数据,其他关联表有匹配才删除对应数据,将INNER JOIN改为LEFT JOIN即可:
DELETE r,ap,f,a FROM report r LEFT JOIN applied_positions ap ON r.position_id=ap.position_id AND r.user_id=ap.user_id LEFT JOIN feedback f ON r.position_id=f.position_id AND r.user_id=f.user_id LEFT JOIN `answeer` a ON r.user_id=a.userID AND r.position_id=a.position WHERE r.user_id=? AND r.position_id=?;
- 第三步:核对命名和参数,检查语句中的表名、字段名拼写、大小写是否和实际库表结构一致,同时验证传入的
user_id、position_id参数值类型、数值是否正确,可单独执行SELECT * FROM report WHERE user_id=参数值 AND position_id=参数值确认基础数据存在。 - 第四步:确认事务提交状态,如果关闭了MySQL Workbench的自动提交功能,执行删除语句后需要手动点击提交按钮,操作才会真正生效。
内容的提问来源于stack exchange,提问作者Noob008
相关产品推荐
相关产品推荐

