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

已插入两条记录仍触发MySQL 1242错误的求助(非子查询语句报错)

解决MySQL Error 1242: Subquery returns more than 1 row 的问题

你遇到的这个错误和插入语句本身无关,问题出在你定义的Personaggio_BEFORE_INSERT_1触发器里。

错误根源分析

看你提供的触发器代码:

CREATE DEFINER = CURRENT_USER TRIGGER NierAutomata . Personaggio_BEFORE_INSERT_1 BEFORE INSERT ON Personaggio FOR EACH ROW BEGIN 
    declare msg VARCHAR(150); 
    if (999999 < (select Personaggio.Salute from Personaggio)) then 
        set msg=concat('La salute massima non può superare il valore di 999.999'); 
        signal sqlstate '45000' set message_text=msg; 
    end if; 
END

这里的子查询(select Personaggio.Salute from Personaggio)会返回表中所有已存在行的Salute值,而你已经插入了2条记录,这个子查询就会返回2行结果。当你用单个数值(999999)和多行结果做比较时,MySQL就会抛出1242: Subquery returns more than 1 row的错误。

显然你的意图是检查新插入行的Salute是否超过上限,而不是检查整个表的所有Salute值。

修正方案

把触发器里的子查询替换成NEW.Salute,NEW是MySQL触发器的关键字,代表即将插入(或更新)的新行数据。修正后的触发器代码如下:

CREATE DEFINER = CURRENT_USER TRIGGER NierAutomata.Personaggio_BEFORE_INSERT_1 BEFORE INSERT ON Personaggio FOR EACH ROW BEGIN 
    declare msg VARCHAR(150); 
    if (NEW.Salute > 999999) then 
        set msg=concat('La salute massima non può superare il valore di 999.999'); 
        signal sqlstate '45000' set message_text=msg; 
    end if; 
END

另外注意你错误提示里写的是999.999(带小数点),但条件里用的是999999,可以根据实际需求统一数值格式。

额外提醒

你提到还有其他3个触发器(1个BEFORE INSERT和2个BEFORE UPDATE),如果它们的逻辑和这个示例类似,也存在查询整个表的子查询,一定要同步修改:

  • 对于BEFORE INSERT触发器,用NEW.字段名访问新插入的数据
  • 对于BEFORE UPDATE触发器,用NEW.字段名访问即将更新后的新值,OLD.字段名访问更新前的旧值

修改完触发器后,再执行你的插入语句应该就能正常运行了。

内容的提问来源于stack exchange,提问作者Duz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:09:06