有一个表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
虽然你的语句是 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源代码实现。
只能通过程序来实现,或者修改MYSQL源代码实现。
#1
在线急等,大神们
#2
虽然你的语句是 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源代码实现。
只能通过程序来实现,或者修改MYSQL源代码实现。