UPDATE语句中能否将activated_at设为updated_at的ON UPDATE新值?
UPDATE语句中activated_at会取updated_at的新值还是旧值?
我已经把updated_at列设置为ON UPDATE CURRENT_TIMESTAMP,现在想在active列从False改为True时,让activated_at列和updated_at列的值保持一致。请问执行下面这条UPDATE语句时,activated_at会使用updated_at的ON UPDATE新值、旧值,还是行为未定义?
UPDATE mytable SET active=TRUE, activated_at=mytable.updated_at WHERE active=FALSE;
结论:会使用updated_at的旧值
原因很直接:在UPDATE语句的SET子句里,直接引用表的列名时,取的是该行更新前的原始值。而updated_at的ON UPDATE CURRENT_TIMESTAMP触发的更新,是在整个UPDATE语句的SET子句赋值逻辑执行完毕之后才会生效的,所以此时activated_at拿到的还是更新前的updated_at值,没法同步到新的时间戳。
如果想让activated_at和updated_at的新值一致,有两种靠谱的做法:
- 直接把
activated_at设为CURRENT_TIMESTAMP,和updated_at用同一个时间源:UPDATE mytable SET active=TRUE, activated_at=CURRENT_TIMESTAMP WHERE active=FALSE; - 用触发器实现:创建一个BEFORE UPDATE触发器,当
active从False变为True时,自动把activated_at设为CURRENT_TIMESTAMP(和updated_at的更新逻辑对齐)。
内容的提问来源于stack exchange,提问作者gmoss
相关产品推荐
相关产品推荐

