说明
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和
documentation
每行后面的语句定义触发器主体;即
每次触发器激活时要执行的语句
我想知道是什么导致时间戳相同:
-
mysql是否执行一次语句并作为优化应用于所有受影响的行?
-
或者它一行一行地执行这些行,但仍然得到相同的时间?为什么?