MYSQL 解发器 NEW.COLUMN 的值不确定

时间:2022-05-06 05:02:10
大家好! 

有一个表1t , 结构如下。
name varchar,
pass varchar,
state int;

已有数据
name     pass       state
-------      -------     --------
name1    pass1     2

触发器的句如下

DROP TRIGGER IF EXISTS t1_update;
CREATE TRIGGER t1_update BEFORE UPDATE ON `t1`
FOR EACH ROW
BEGIN
IF NEW.state !=2 AND OLD.state !=1 THEN
SET NEW.state = 3;
END IF;
END;


当我执行语句 
update t1 set `name`="name2" where `name`="name1"
 的时候期望 state 的值自动为3.
可以触发器的IF NEW.state!=2 并不成立,所以想问一下,update 语句里没有更新state的情况下,要怎么判断这个值。
如果 update 语句里 有set state=2 的情况是不能修改为3的。

4 个解决方案

#1


在线急等,大神们

#2


引用 1 楼 yousteely 的回复:
在线急等,大神们


虽然你的语句是 update t1 set `name`="name2" where `name`="name1"

但实际上在update时,是每个字段都会更新的,所以这个时候 NEW.state还是2,所以就不会去更新这个数据。

#3



没有太看懂你的需求。

可以改成这样试试:
CREATE TRIGGER t1_update BEFORE UPDATE ON `t1` 
FOR EACH ROW 
BEGIN 
    IF (NEW.state =OLD.state or OLD.state = 2) AND OLD.state !=1 THEN 
        SET NEW.state = 3; 
    END IF; 
END;


实际上,你可以按照你自己的实际需要进行修改 ,上面的 NEW.state =OLD.state,表示在update语句中,并没有去修改 state字段,你可以按照这个思路自己修改一下

#4


这个目前的MYSQL版本中无法实现。 OLD 是更新前的值,NEW是更新后的值。所以不管有没有在UPDATE SET中,都会有值。
只能通过程序来实现,或者修改MYSQL源代码实现。

#1


在线急等,大神们

#2


引用 1 楼 yousteely 的回复:
在线急等,大神们


虽然你的语句是 update t1 set `name`="name2" where `name`="name1"

但实际上在update时,是每个字段都会更新的,所以这个时候 NEW.state还是2,所以就不会去更新这个数据。

#3



没有太看懂你的需求。

可以改成这样试试:
CREATE TRIGGER t1_update BEFORE UPDATE ON `t1` 
FOR EACH ROW 
BEGIN 
    IF (NEW.state =OLD.state or OLD.state = 2) AND OLD.state !=1 THEN 
        SET NEW.state = 3; 
    END IF; 
END;


实际上,你可以按照你自己的实际需要进行修改 ,上面的 NEW.state =OLD.state,表示在update语句中,并没有去修改 state字段,你可以按照这个思路自己修改一下

#4


这个目前的MYSQL版本中无法实现。 OLD 是更新前的值,NEW是更新后的值。所以不管有没有在UPDATE SET中,都会有值。
只能通过程序来实现,或者修改MYSQL源代码实现。