MySQL多表DELETE语句未删除任何数据的问题咨询
多表DELETE未生效的原因及解决办法
问题原因
你使用的STRAIGHT_JOIN强制指定以passgr表作为驱动表,只有当passgr表中存在与flight表(cityfrom_id=1的3条目标记录)关联的flight_id匹配记录时,JOIN结果集才会有数据,DELETE操作才能生效。如果没有任何passgr记录关联这3条flight记录,JOIN后的结果集为空,自然不会删除任何数据。
解决方案
1. 先验证关联关系
执行以下SQL确认是否存在关联的passgr记录:
SELECT COUNT(*) FROM passgr p JOIN flight f ON p.flight_id=f.flight_id WHERE f.cityfrom_id=1;
如果结果为0,说明确实没有关联记录,这就是DELETE未生效的根本原因。
2. 按需选择删除方式
- 仅删除flight表的3条目标记录(无需关联passgr时):直接单独执行DELETE,不需要JOIN:
DELETE FROM flight WHERE cityfrom_id=1; - 同时删除关联的passgr和flight记录(确认有匹配的passgr记录时):去掉
STRAIGHT_JOIN,让MySQL优化器自动选择合适的驱动表,或显式使用普通JOIN:DELETE p, f FROM passgr p JOIN flight f ON p.flight_id=f.flight_id WHERE f.cityfrom_id=1; - 即使无关联passgr记录,也要删除flight表的目标记录:可以分开执行DELETE,先处理flight再处理passgr(如果需要),或调整RIGHT JOIN的驱动表顺序:
注:RIGHT JOIN下若passgr无匹配记录,DELETE p, f FROM flight f RIGHT JOIN passgr p ON p.flight_id=f.flight_id WHERE f.cityfrom_id=1;p相关字段为NULL,DELETEp不会删除任何passgr记录,只会删除匹配的flight记录。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

