You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:42:20