已插入两条记录仍触发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
相关产品推荐
相关产品推荐

