首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -如何为多行执行“每一行”语句?

问MySQL -如何为多行执行“每一行”语句?
EN

Stack Overflow用户
提问于 2018-09-14 08:43:26
回答 1查看 102关注 0票数 0

描述

我有一个预更新触发器来填充updated_at字段来记录更新时间。我使用了for each row语句,并期望每一行都有不同的时间戳。但是,如果我在一条语句中更新多行,那么所有行都会得到相同的时间戳。

示例

用于下表和触发器:

代码语言:javascript
复制
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 ;

和现有数据:

代码语言:javascript
复制
+----+-----+------------+
| id | bar | updated_at |
+----+-----+------------+
|  1 | a   | 0          |
|  2 | b   | 0          |
|  3 | c   | 0          |
+----+-----+------------+

当我运行UPDATE foo SET bar = 'd';时,我希望有三个不同的时间戳,但是我得到了:

代码语言:javascript
复制
+----+-----+------------------+
| id | bar | updated_at       |
+----+-----+------------------+
|  1 | d   | 1536903279930403 |
|  2 | d   | 1536903279930403 |
|  3 | d   | 1536903279930403 |
+----+-----+------------------+

我的问题

我使用MySQL5.7和文档

每一行的下面的语句定义了触发器主体;也就是说,每次触发器激活时执行的语句,该语句针对受触发事件影响的每一行发生一次。

我想知道是什么导致时间戳是一样的:

  • mysql执行语句一次并作为优化应用于所有受影响的行吗?
  • 或者它一个一个地执行那些行,但仍然得到相同的时间?为什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-14 08:56:27

如果希望为每一行设置不同的时间,则需要使用SYSDATE()。来自NOW()的手册

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52328157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档