Описание
У меня есть триггер до обновления, чтобы заполнить поле 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 и из документации:
Заявление, следующее за КАЖДОЙ РУКОЙ, определяет тело триггера; то есть оператор, выполняемый каждый раз при активации триггера, который происходит один раз для каждой строки, затронутой инициирующим событием.
Я хочу знать, что приводит к тому, что временные метки будут одинаковыми:
Если вы хотите разное время для каждой строки, вам нужно использовать SYSDATE()
. Из руководства для NOW()
:
(Внутри хранимой функции или триггера NOW() возвращает время, в которое начинает выполняться инструкция функции или запуска.) Это отличается от поведения SYSDATE(), которое возвращает точное время, в которое оно выполняется.