MALOUDA-PSA 2025-03-09 21:21 采纳率: 85.6%
浏览 9

MySQL触发器的问题5


 
 
 
DELIMITER $$
 
CREATE TRIGGER update_fxj_before_update
after UPDATE ON fxj
FOR EACH ROW
BEGIN
    -- 仅当 stknew 发生变化时执行
    IF NEW.stknew <> OLD.stknew OR (NEW.stknew IS NULL AND OLD.stknew IS NOT NULL) OR (NEW.stknew IS NOT NULL AND OLD.stknew IS NULL) THEN
        -- 更新 c2exp12 的逻辑
        IF old.expma12 = 0 THEN
            SET c2exp12 = 100;
        ELSE
            SET c2exp12 = (NEW.stknew - NEW.expma12) / NEW.expma12 * 100;
        END IF;
 
        -- 更新 c2exp50 的逻辑
        IF old.expma50 = 0 THEN
            SET c2exp50 = 100;
        ELSE
            SET c2exp50 = (NEW.stknew - NEW.expma50) / NEW.expma50 * 100;
        END IF;
    END IF;
END$$
 
DELIMITER ;

上面的触发器是希望在 表 fxj 里面 当 fxj.stknew 更新时, 就更新 c2exp12, c2exp12 里面的值, (stknew - expma12) / xpma12 , 其中 stknew, expma12, expma50都是同一张表里面的列 , 现在报错:
END

1362 - Updating of NEW row is not allowed in after trigger
时间: 0.042s

  • 写回答

3条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-03-09 21:21
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    这个报错是因为在 AFTER UPDATE 触发器中,不能直接更新 NEW 行的数据。可以将触发器改为 BEFORE UPDATE 触发器,如下所示:
    DELIMITER $$
    CREATE TRIGGER update_fxj_before_update
    BEFORE UPDATE ON fxj
    FOR EACH ROW
    BEGIN    
        IF NEW.stknew <> OLD.stknew 
        OR (NEW.stknew IS NULL AND OLD.stknew IS NOT NULL) 
        OR (NEW.stknew IS NOT NULL AND OLD.stknew IS NULL) 
        THEN        
            IF OLD.expma12 = 0 
            THEN            
                SET NEW.c2exp12 = 100;
            ELSE            
                SET NEW.c2exp12 = (NEW.stknew - NEW.expma12) / NEW.expma12 * 100;
            END IF;         
            
            IF OLD.expma50 = 0 
            THEN            
                SET NEW.c2exp50 = 100;
            ELSE            
                SET NEW.c2exp50 = (NEW.stknew - NEW.expma50) / NEW.expma50 * 100;
            END IF;
        END IF;
    END$$ 
    DELIMITER ;
    

    这样修改后,在更新 fxj 表时,触发器会在更新前先对 c2exp12 和 c2exp50 进行计算和更新。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月9日