mysql-如何对多行执行“for each row”语句?

arknldoa  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(320)

描述
我有一个更新前触发器要填充 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是否执行一次语句并作为优化应用于所有受影响的行?
或者它一行一行地执行这些行,但仍然得到相同的时间?为什么?

xfb7svmp

xfb7svmp1#

如果希望每行的时间不同,则需要使用 SYSDATE() . 从手册中 NOW() :
(在存储的函数或触发器中,now()返回函数或触发器语句开始执行的时间。)这与sysdate()的行为不同,后者返回函数或触发器执行的确切时间。

相关问题