执行MySQL无SELECT的UPDATE语句遇ERROR 1242子查询多行错误求助
解决UPDATE语句无显式子查询却报Subquery returns more than 1 row错误
你遇到的这个问题确实有点反直觉——明明你的UPDATE语句里没写任何显式子查询,目标行也只有一行,却触发了ERROR 1242 (21000): Subquery returns more than 1 row错误。
最可能的原因是你的rad表上挂了关联触发器(Trigger),当你执行UPDATE操作时触发器被触发,而触发器内部的SQL逻辑里藏着返回多行结果的子查询,这个错误被关联到了你的UPDATE语句上,才让你误以为是更新本身出了问题。
排查&验证步骤:
先检查
rad表有没有触发器:
执行下面的SQL就能看到表的触发器信息:SHOW TRIGGERS LIKE 'rad';或者更精准的查询:
SELECT trigger_name, action_timing, event_manipulation FROM information_schema.triggers WHERE trigger_schema = DATABASE() AND event_object_table = 'rad';如果查到有触发器,就看它的具体定义:
假设触发器名叫rad_update_trigger,执行:SHOW CREATE TRIGGER rad_update_trigger;重点看触发器里的
SELECT语句或者子查询部分,大概率是某个子查询返回了多行结果,但触发器的逻辑(比如给变量赋值、同步更新其他表)没法处理多行数据。临时禁用触发器验证猜测:
-- 先禁用所有触发器(操作前确认业务允许这么做) ALTER TABLE rad DISABLE TRIGGER ALL; -- 再执行你的UPDATE语句 UPDATE rad SET `IDType` = '1', `XB` = '1096513935', `Name` = 'R2', `Identifier` = '3', `IDGPS` = '3', `IDSect` = '5', `Initial` = '0', `IDModif` = '99', `DateModif` = NOW() WHERE IDRad = '3'; -- 执行完记得重新启用触发器 ALTER TABLE rad ENABLE TRIGGER ALL;如果禁用后UPDATE能成功,那就实锤是触发器的问题了。
常见修复方向:
- 如果触发器里的子查询本就该返回唯一结果:给子查询加
LIMIT 1,或者调整WHERE条件确保结果唯一。 - 如果子查询确实需要返回多行:修改触发器逻辑,比如用
CURSOR遍历结果,或者调整业务逻辑避免这种场景。
内容的提问来源于stack exchange,提问作者sincos
相关产品推荐
相关产品推荐

