MySQL执行UPDATE部分记录报错1242:子查询返回多行如何解决
问题成因
你执行的UPDATE语句本身没有嵌套子查询,报错Error Code: 1242. Subquery returns more than 1 row的根因是files表上绑定了UPDATE类型的触发器:
触发器的逻辑中存在未限制返回行数的子查询,当你更新id=105的记录时,该条记录的token有值,触发了子查询执行逻辑,且该token值匹配到了子查询结果集中的多条记录,因此抛出错误;而id=100的记录token为空,刚好跳过了触发器中子查询的执行分支,因此不会触发报错。该问题和记录锁定、token字段本身的取值没有直接关联。
排查步骤
- 首先执行以下语句查询files表绑定的所有触发器:
SHOW TRIGGERS LIKE 'files'; - 筛选出
Event为UPDATE的触发器,执行以下语句查看触发器的完整定义(将下方<触发器名称>替换为你查到的实际触发器名):SHOW CREATE TRIGGER <触发器名称>; - 查找触发器定义中类似
SET @变量 = (SELECT 字段 FROM 其他表 WHERE 条件 = NEW.token)的写法,确认当NEW.token为b6d8cf9af75faec429199a6150aa38a094547332时,该子查询的返回结果是否超过1行。
解决方案
- 如果业务允许子查询取任意一条匹配结果,直接在子查询末尾添加
LIMIT 1,确保子查询始终只返回1行结果即可。 - 如果业务要求子查询必须返回唯一匹配结果,调整子查询的WHERE筛选条件,增加唯一字段(比如主键id)作为筛选项,避免出现多匹配的情况。
- 如果该触发器为冗余无用逻辑,直接执行
DROP TRIGGER <触发器名称>;删除触发器即可。
修改完成后重新执行你的UPDATE语句即可正常更新id=105的记录。
内容的提问来源于stack exchange,提问作者Pessi S.
相关产品推荐
相关产品推荐

