mysql触发器语句问题


我想建一个触发器,当插入brxx表前,对插入的数据字段fbsj(data类型)进行处理,转化为“yy春”,通过newbing写出了下面的代码:

create trigger brxxfbjd
before insert on brxx 
for each row
BEGIN
    declare mm int;
    set mm=month(new.fbsj);
    case mm
    WHEN mm=3 OR mm=4 OR mm=5 THEN SET NEW.fbjd = CONCAT(SUBSTR(NEW.fbsj, 1, 4), '春');
    WHEN mm=6 OR mm=7 OR mm=8 THEN SET NEW.fbjd = CONCAT(SUBSTR(NEW.fbsj, 1, 4), '夏');
    WHEN mm=9 OR mm=10 OR mm=11 THEN SET NEW.fbjd = CONCAT(SUBSTR(NEW.fbsj, 1, 4), '秋');
    else  SET NEW.fbjd = CONCAT(SUBSTR(NEW.fbsj, 1, 4), '冬');
   END CASE;
END;

INSERT INTO brxx ( brmc, brxb, brqy, jbmc, fbsj ) 
VALUE
    ( 'xxx', '男', '浙江', '新冠', '2022-09-24' );
INSERT INTO brxx ( brmc, brxb, brqy, jbmc, fbsj ) 
VALUE
    ( 'xyz', '男', '浙江', '新冠', '2021-05-12' );
INSERT INTO brxx ( brmc, brxb, brqy, jbmc, fbsj ) 
VALUE
    ( 'wxy', '男', '浙江', '新冠', '2022-07-2' );

但是插入数据后fbjd全是冬
如图
​​

img

这是为什么?这个触发器应该怎么改?

触发器中出现问题的是 CASE 语句中的判断条件,应该是 WHEN mm=3 OR mm=4 OR mm=5 而不是 WHEN mm=3 OR mm=4 OR mm=5 THEN。因此,每个分支都会被执行,导致最终结果是最后一个分支所设置的结果。

以下是修改后的代码:

CREATE TRIGGER brxxfbjd
BEFORE INSERT ON brxx 
FOR EACH ROW
BEGIN
    DECLARE mm INT;
    SET mm = MONTH(NEW.fbsj);
    CASE
        WHEN mm = 3 OR mm = 4 OR mm = 5 THEN
            SET NEW.fbjd = CONCAT(SUBSTR(NEW.fbsj, 1, 4), '春');
        WHEN mm = 6 OR mm = 7 OR mm = 8 THEN
            SET NEW.fbjd = CONCAT(SUBSTR(NEW.fbsj, 1, 4), '夏');
        WHEN mm = 9 OR mm = 10 OR mm = 11 THEN
            SET NEW.fbjd = CONCAT(SUBSTR(NEW.fbsj, 1, 4), '秋');
        ELSE
            SET NEW.fbjd = CONCAT(SUBSTR(NEW.fbsj, 1, 4), '冬');
    END CASE;
END;


在上述代码中,判断条件已被纠正,以避免所有情况都被执行的问题。请注意,使用 WHEN 关键字后不需要加上 THEN。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^