MySQL存储过程报1172 Result consisted of more that one row错误
报错根因
1172 Result consisted of more than one row报错的触发逻辑非常明确:MySQL中SELECT 字段 INTO 变量的语法要求查询结果必须恰好返回1行,而你的salarisschaal表存储了多行薪资等级记录,单行声明的标量变量无法承接多行结果集,直接触发报错。
除此之外你的原有代码还有两处逻辑错误:
- 更新
salarisschaal表时写的SET onder = xxx、SET boven = xxx是修改存储过程内的局部变量,不是更新表字段,执行后不会对表内数据产生任何修改 - 完全没必要先把字段值查询到局部变量再做计算,这类全表统一比例调整的场景,直接在UPDATE语句内做字段计算是最高效的实现方式,不会触发多行结果报错。
修正后的最优实现代码
DELIMITER $$ CREATE PROCEDURE AlgemeneSalarisVerhoging(verhoging float) BEGIN START TRANSACTION; -- 按比例统一上调所有员工薪资 UPDATE werknemer SET salaris = salaris * (1 + verhoging / 100); -- 按比例统一上调所有薪资等级的上下限,逐行直接计算无需提前查询赋值 UPDATE salarisschaal SET ondergrens = ondergrens * (1 + verhoging / 100), bovengrens = bovengrens * (1 + verhoging / 100); COMMIT; END$$ DELIMITER ;
方案说明
- 移除了多余的局部变量定义、单行查询赋值逻辑,从根源上避免1172报错
- 所有相关数值都会严格按照传入的上调百分比统一计算,完全匹配需求
- 整个更新逻辑包裹在事务中,保证员工薪资、薪资等级上下限的更新原子性,不会出现部分更新成功的数据不一致问题
- 计算逻辑和你原有写法完全等价,写法做了简化,可读性更高。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

