代码之家  ›  专栏  ›  技术社区  ›  CtheSky

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

  •  0
  • CtheSky  · 技术社区  · 8 年前

    说明
    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是否执行一次语句并作为优化应用于所有受影响的行?
    • 或者它一行一行地执行这些行,但仍然得到相同的时间?为什么?
    1 回复  |  直到 8 年前
        1
  •  1
  •   Nick SamSmith1986    8 年前

    如果你 希望 每行的时间不同,需要使用 SYSDATE() . 从手册中 NOW()

    (在存储的函数或触发器中,NOW()返回 函数或触发语句开始执行。)这与 从SYSDATE()的行为中,返回 它执行。