MySQL 5.7 подготовил операторы, обновляющие неправильный столбец отметки времени - PullRequest
0 голосов
/ 15 апреля 2019

У меня возникают некоторые проблемы с обновлением таблицы при использовании с подготовленным оператором. Похоже, что MySQL обновляет неправильный столбец, который даже не был указан в команде обновления.

Приготовление:

drop table test1;
create table test1(
  id int not null,
  show_from timestamp not null,
  updated_at timestamp NULL DEFAULT NULL
);
insert into test1(id, show_from, updated_at) values(1, '2018-01-11 12:10:11.19808', '2019-04-15 11:50:00.704748');

сделать это в одной партии:

UPDATE test1 SET show_from='2018-04-15 11:50:00.704748' WHERE id=1;
SELECT * FROM test1;

возвращается:

1    2018-04-15 13:50:01    2019-04-15 13:50:01

как и ожидалось.

Теперь сделайте это в одной партии:

PREPARE stmt1 FROM 'UPDATE test1 SET updated_at=? WHERE id=?';
SET @s1='2019-02-11 12:12:11.19808';
SET @s2=1;
EXECUTE stmt1 USING @s1, @s2;
DEALLOCATE PREPARE stmt1;
SELECT * FROM test1;

возвращается:

1    2019-04-15 12:54:27    2019-02-11 13:12:11

Почему MySQL обновил столбец show_from?

1 Ответ

1 голос
/ 15 апреля 2019

В столбце указана временная метка, не равно нулю :

show_from timestamp not null

В этом режиме MySQL будет обновлять столбец каждый раз, когда обновляется строка (любой из ее столбцов). Из руководства :

Если системная переменная explicit_defaults_for_timestamp отключена, первый столбец TIMESTAMP содержит оба значения: DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP, если ни одно из них не указано явно.

Документация предлагает обходные пути, такие как:

  • Определите столбец с предложением DEFAULT, в котором указано постоянное значение по умолчанию.

  • Укажите атрибут NULL. Это также заставляет столбец разрешать значения NULL, что означает, что вы не можете назначить текущую метку времени установив для столбца значение NULL.

Я бы порекомендовал это:

  • Включить системную переменную explicit_defaults_for_timestamp.
...