Обновления полей MySQL CURRENT_TIMESTAMP при каждом обновлении

Лучший способ объяснить эту проблему – пример.

У меня есть таблица:

CREATE TABLE `example` ( `id` int(11) NOT NULL AUTO_INCREMENT, `data` varchar(255) DEFAULT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 

Результат:

    id |  данные |  создано |  обновленный
  (NULL) |  (NULL) |  (NULL) |  (НОЛЬ)

Затем я вставляю некоторые данные:

 INSERT INTO example ( `data` ) VALUES ( 'abc123' ) 

Результат:

   id |  данные |  создано |  обновленный
    1 |  abc123 |  2013-01-16 13:12:16 |  (НОЛЬ)

И затем я обновляю

 UPDATE example SET `data` = 'def456', `updated` = NOW() WHERE id = 1 

Результат:

   id |  данные |  создано |  обновленный
    1 |  def456 |  2013-01-16 13:16:24 |  2013-01-16 13:14:26

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

updated должно быть: TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Таким образом, ваш CREATE TABLE будет:

 CREATE TABLE `example` ( `id` int(11) NOT NULL AUTO_INCREMENT, `data` varchar(255) DEFAULT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 

Это означает, что при выполнении UPDATE в будущем вам не нужно будет передавать переменную обновления, потому что MySQL автоматически обновит ее для вас 🙂

Вероятно, случайная таблица проблем была создана случайно:

 CREATE TABLE `example` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `data` VARCHAR(255) DEFAULT NULL, `created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `updated` DATETIME DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MYISAM DEFAULT CHARSET=utf8; 

Возможно, кто-то использовал стороннее программное обеспечение для его создания?

ON UPDATE CURRENT_TIMESTAMP собирается уничтожить дату создания. Поэтому для решения проблемы используйте ALTER TABLE следующим образом:

 ALTER TABLE example CHANGE created created TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 

Это избавит вас от нежелательной перезаписи created поля при каждом обновлении.