MySQL - как операторы «для каждой строки» выполняются для нескольких строк?

0

Описание
У меня есть триггер до обновления, чтобы заполнить поле updated_at чтобы обновить время регистрации. Я использовал for each row оператора 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 и из документации:

Заявление, следующее за КАЖДОЙ РУКОЙ, определяет тело триггера; то есть оператор, выполняемый каждый раз при активации триггера, который происходит один раз для каждой строки, затронутой инициирующим событием.

Я хочу знать, что приводит к тому, что временные метки будут одинаковыми:

  • Дозировать mysql выполнить инструкцию один раз и применить ко всем затронутым строкам в качестве оптимизации?
  • Или он выполняет эти строки один за другим, но все равно получает одно и то же время? Зачем?
Теги:
database
triggers

1 ответ

1
Лучший ответ

Если вы хотите разное время для каждой строки, вам нужно использовать SYSDATE(). Из руководства для NOW():

(Внутри хранимой функции или триггера NOW() возвращает время, в которое начинает выполняться инструкция функции или запуска.) Это отличается от поведения SYSDATE(), которое возвращает точное время, в которое оно выполняется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню