MySQL触发器失效:需跨表获取字段值实现计算功能
修复MySQL触发器计算resteAPaye的问题
原代码存在的问题
- 硬编码
idETD=1,无法关联当前插入的evolution记录,每次只会取固定ID的数值,不符合业务逻辑 - 声明了局部变量
pmd却未使用,反而用了会话变量@pmd,属于冗余写法 SET语句后添加WHERE是语法错误,触发器中给NEW字段赋值无需条件,因为是针对当前正在插入的行- 未处理
inscription表中找不到对应idETD的情况,会导致resteAPaye赋值为NULL
修正后的触发器代码
DELIMITER $$ CREATE TRIGGER trg_rap BEFORE INSERT ON evolution FOR EACH ROW BEGIN -- 声明局部变量并设置默认值,避免无匹配时为NULL DECLARE pmd FLOAT DEFAULT 0; -- 根据当前插入记录的idETD匹配inscription表数据 SELECT prixMisDaccord INTO pmd FROM inscription WHERE inscription.idETD = NEW.idETD LIMIT 1; -- 限制返回1条记录,防止多行赋值报错 -- 计算并赋值resteAPaye SET NEW.resteAPaye = pmd - NEW.prixPaye; END; $$ DELIMITER ;
关键修正说明
- 使用
NEW.idETD关联当前插入的evolution记录与inscription表,确保取到对应业务数据 - 给
pmd设置默认值0,避免inscription无匹配记录时计算结果为NULL - 添加
LIMIT 1防止inscription表存在重复idETD记录时触发多行赋值错误 - 移除无效的
WHERE子句,直接对NEW.resteAPaye赋值
内容的提问来源于stack exchange,提问作者MOÂAD
相关产品推荐
相关产品推荐

