MySQL - как операторы «для каждой строки» выполняются для нескольких строк? - PullRequest
0 голосов
/ 14 сентября 2018

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

Оператор, следующий за FOR EACH ROW, определяет тело триггера; тот является оператор для выполнения каждый раз, когда активируется триггер, который происходит один раз для каждой строки, на которую воздействует инициирующее событие.

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

  • Дозировать оператор выполнения mysql один раз и применить ко всем затронутым строкам в качестве оптимизации?
  • Или он выполняет эти строки одну за другой, но все равно получает одинаковое время? Почему?

1 Ответ

0 голосов
/ 14 сентября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...