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

steely_chen 2016-05-26 06:38:14
大家好!

有一个表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的。
...全文
112 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2016-05-27
  • 打赏
  • 举报
回复
引用 1 楼 yousteely 的回复:
在线急等,大神们
虽然你的语句是 update t1 set `name`="name2" where `name`="name1" 但实际上在update时,是每个字段都会更新的,所以这个时候 NEW.state还是2,所以就不会去更新这个数据。
ACMAIN_CHM 2016-05-27
  • 打赏
  • 举报
回复
这个目前的MYSQL版本中无法实现。 OLD 是更新前的值,NEW是更新后的值。所以不管有没有在UPDATE SET中,都会有值。 只能通过程序来实现,或者修改MYSQL源代码实现。
LongRui888 2016-05-27
  • 打赏
  • 举报
回复
没有太看懂你的需求。 可以改成这样试试:
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字段,你可以按照这个思路自己修改一下
steely_chen 2016-05-26
  • 打赏
  • 举报
回复
在线急等,大神们

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧