Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Подлые даты в Mysql
Постоянная ссылка 16-04-2008 anydoby java

Сегодня наткнулся на очень неприятную бяку в MySQL. Все началось с того, что у меня в одной таблице 3 поля типа TIMESTAMP. Два из них чисто служебные: dateCreated и lastModified. На них я поставил триггеры, которые автоматически обновляют их значения в текущее время, когда происходит insert или update соответственно. А вот 3-е поле я устанавливаю сам. Заметил странную вещь - когда я обновляю строку, то это 3-е поле автоматически устанавливается в текущее время. В общем, вот простой пример, как это воспроизвести:


create table test (
  id integer primary key auto_increment
, value integer
, expires timestamp
);

insert into test (value,expires) values (1, '2010-10-20 10:00:00.0');

update test set value = 2 where id = 1;

Колонка expires обновилась в текущее время, хотя ее никто об этом не просил. Лечится установкой типа колонки в DATETIME. Может я что-то пропустил в доке по MySQL? Но мне кажется, что там не было ничего сказано о том, что TIMESTAMP должна обновляться сама собой.

Добавить комментарий

pv
17-05-2009

TIMESTAMP представляет собой тип столбца, который можно использовать для автома­тической отметки текущей даты и времени при выполнении операций UPDATE или INSERT. Если в таблице несколько столбцов типа TIMESTAMP, только первый из них об­новляется автоматически. Автоматическое обновление первого столбца TIMESTAMP в таблице выполняется при наступлении одного из следующих условий:

1. При явном присвоении ему значения NULL. 2. Столбец не указан явно в операторе INSERT или LOAD DATA INFILE. 3. Столбец не указан явно в операторе UPDATE, а значение какого-то другого столбца при этом изменяется. Оператор UPDATE, устанавливающий столбцу такое же значение, как он имел ранее, не приводит к обновлению столбца TIMESTAMP. Если вы присваиваете старое значение, MySQL игнорирует это в целях эффективности. отсюда http://www.weblibrary.biz/mysql/tipy-stolbcov/tipy-daty/tipy-daty-datetime

anydoby
18-05-2009

Спасибо :)

Но согласитесь, довольно хитрое поведение.

Предыдущая статья Одно сообщение на поле в Spring MVC Следующая статья DWR 2.0.3 не работает со Spring 2.5