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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:45:31