我想建一个触发器,当插入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全是冬
如图
这是为什么?这个触发器应该怎么改?
触发器中出现问题的是 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。
不知道你这个问题是否已经解决, 如果还没有解决的话: