MySQL中带NOT EXISTS的DELETE语句显示0 rows affected的问题
问题排查与解决
嘿,我一眼就瞅出问题出在哪了——你的DELETE语句里出现了列引用歧义!
咱们先对比下你那两条SQL的差异:
- 正常运行的SELECT语句给
actors表加了别名a,子查询里的z.actorid = a.actorid明确关联了actors表和movies表的actorid,能精准找出没有对应电影记录的演员。 - 但DELETE语句里没给
actors表加别名,子查询里的actorid会被MySQL优先解析成子查询范围内的movies表(也就是z表)的actorid。这就导致子查询变成了select 1 from movies z where z.actorid = z.actorid——这条件永远为真,所以NOT EXISTS的结果永远是假,自然删不到任何数据。
两种快速解决办法:
- 办法一:给
actors表加别名,和SELECT语句保持一致delete from actors a where NOT EXISTS(select 1 from movies z where z.actorid = a.actorid ); - 办法二:明确指定
actors表的actoriddelete from actors where NOT EXISTS(select 1 from movies z where z.actorid = actors.actorid );
你可以先跑一遍原来的SELECT语句确认要删除的行数,再用修正后的DELETE执行,就能看到预期的删除效果啦!
内容的提问来源于stack exchange,提问作者ABDUL GAFFAR
相关产品推荐
相关产品推荐

