Лучший способ объяснить эту проблему – пример.
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
поля при каждом обновлении.