MySQL - 如何为多行执行“for each row”语句?

问题描述 投票:0回答:1

描述 我有一个更新之前的触发器来填充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 |
+----+-----+------------------+

我的问题 我正在使用mysql 5.7和documentation

FOR EACH ROW后面的语句定义了触发器体;也就是说,每次触发器激活时执行的语句,对于受触发事件影响的每一行都会发生一次。

我想知道导致时间戳相同的原因:

  • 将mysql执行语句一次并作为优化应用于所有受影响的行?
  • 或者它逐个执行这些行但仍然得到相同的时间?为什么?
mysql database triggers
1个回答
1
投票

如果你想要每行不同的时间,你需要使用SYSDATE()。来自NOW()的手册:

(在存储的函数或触发器中,NOW()返回函数或触发语句开始执行的时间。)这与SYSDATE()的行为不同,后者返回执行它的确切时间。

© www.soinside.com 2019 - 2024. All rights reserved.