描述
我有一个更新前触发器要填充 updated_at
记录更新时间的字段。我用了 for each row
语句,并期望每行具有不同的时间戳。但如果我在一条语句中更新多行,所有行都会得到相同的时间戳。
例子
对于下表和触发器:
CREATE TABLE `foo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bar` varchar(255) NOT NULL,
`updated_at` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
delimiter $$
create trigger foo_before_update before update on `foo`
for each row begin
set new.updated_at = UNIX_TIMESTAMP(now(6)) * 1000000;
end $$
delimiter ;
和现有数据:
+----+-----+------------+
| id | bar | updated_at |
+----+-----+------------+
| 1 | a | 0 |
| 2 | b | 0 |
| 3 | c | 0 |
+----+-----+------------+
当我跑的时候 UPDATE foo SET bar = 'd';
,我希望有三个不同的时间戳,但我得到了:
+----+-----+------------------+
| id | bar | updated_at |
+----+-----+------------------+
| 1 | d | 1536903279930403 |
| 2 | d | 1536903279930403 |
| 3 | d | 1536903279930403 |
+----+-----+------------------+
我的问题
我使用的是MySQL5.7和以下文档:
每行后面的语句定义触发器主体;也就是说,每次触发器激活时要执行的语句,对受触发事件影响的每行执行一次。
我想知道是什么导致时间戳相同:
mysql是否执行一次语句并作为优化应用于所有受影响的行?
或者它一行一行地执行这些行,但仍然得到相同的时间?为什么?
1条答案
按热度按时间xfb7svmp1#
如果希望每行的时间不同,则需要使用
SYSDATE()
. 从手册中NOW()
:(在存储的函数或触发器中,now()返回函数或触发器语句开始执行的时间。)这与sysdate()的行为不同,后者返回函数或触发器执行的确切时间。