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