INSERT语句中子查询结果无法插入及多返回行报错求助
问题分析与解决方案
核心问题
你的INSERT语句中嵌套的子查询没有关联当前插入的记录,而是从gb.uträckning全表中查询匹配objekttyp = t2.lägenhetstyp的行:
- 当表中存在多条匹配行时,子查询返回多行,触发"
Subquery returns more than 1 row"错误; - 即使子查询返回单行,也是表中已有旧数据的计算结果,而非当前插入行对应的值,这就是无报错但值无法正确插入的原因。
修正后的单条INSERT语句
将原VALUES子句改为INSERT ... SELECT形式,直接绑定当前插入的参数进行计算,避免子查询范围错误:
INSERT INTO `gb.uträckning`(of_bostäder_objekt, typ_av_objekt, objekttyp, antal_kvm, relativt_hyrestal_bastal) SELECT 22105859, 'B', 'B2K', 64, -- 用CASE替代多层IF,提升可读性 IF('B' IN ('B', 'NyB'), 64 + (SELECT CASE 1 WHEN 1 THEN t2.`2` WHEN 2 THEN t2.`1` WHEN 3 THEN t2.`3` ELSE t2.`2` END FROM `nh.lägenhetstyp` t2 WHERE t2.lägenhetstyp = 'B2K'), NULL)
适配批量处理的触发器实现
如果要在触发器中实现多行批量插入的自动计算,需要使用NEW关键字获取当前插入行的字段值,确保每行都能基于自身数据计算结果:
DELIMITER // CREATE TRIGGER trg_gb_utrackning_before_insert BEFORE INSERT ON `gb.uträckning` FOR EACH ROW BEGIN SET NEW.relativt_hyrestal_bastal = IF(NEW.typ_av_objekt IN ('B', 'NyB'), NEW.antal_kvm + (SELECT CASE NEW.balkong_uteplats_saknas WHEN 1 THEN t2.`2` WHEN 2 THEN t2.`1` WHEN 3 THEN t2.`3` ELSE t2.`2` END FROM `nh.lägenhetstyp` t2 WHERE t2.lägenhetstyp = NEW.objekttyp), NULL); END // DELIMITER ;
触发器说明
- 使用
BEFORE INSERT触发器,在数据插入前自动计算并赋值relativt_hyrestal_bastal字段; NEW关键字代表当前正在插入的行,通过它可以获取该行的所有字段值,确保计算逻辑与当前行绑定;- 用
CASE WHEN替代多层嵌套IF,逻辑更清晰,便于维护。
内容的提问来源于stack exchange,提问作者Igor Skarbinski
相关产品推荐
相关产品推荐

