Вот как можно получить автоматические и гибкие поля createDate / lastModified с помощью триггеров:
Сначала определите их так:
CREATE TABLE `entity` (
`entityid` int(11) NOT NULL AUTO_INCREMENT,
`createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastModified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`name` varchar(255) DEFAULT NULL,
`comment` text,
PRIMARY KEY (`entityid`),
)
Затем добавьте эти триггеры:
DELIMITER ;;
CREATE trigger entityinsert BEFORE INSERT ON entity FOR EACH ROW BEGIN SET NEW.createDate=IF(ISNULL(NEW.createDate) OR NEW.createDate='0000-00-00 00:00:00', CURRENT_TIMESTAMP, IF(NEW.createDate<CURRENT_TIMESTAMP, NEW.createDate, CURRENT_TIMESTAMP));SET NEW.lastModified=NEW.createDate; END;;
DELIMITER ;
CREATE trigger entityupdate BEFORE UPDATE ON entity FOR EACH ROW SET NEW.lastModified=IF(NEW.lastModified<OLD.lastModified, OLD.lastModified, CURRENT_TIMESTAMP);
- Если вы вставляете без указания createDate или lastModified, они будут равны и будут установлены на текущую метку времени.
- Если вы обновите их без указания createDate или lastModified, для lastModified будет установлена текущая отметка времени.
Но вот что самое приятное:
- Если вы вставляете , вы можете указать createDate старше, чем текущая метка времени , что позволяет импортировать из более старых времен (lastModified будет равно createDate).
- Если вы обновляете , вы можете указать lastModified старше предыдущего значения ('0000-00-00 00:00:00' работает хорошо), что позволяет обновить запись, если вы делаете косметические изменения (исправление опечатки в комментарии ) и вы хотите сохранить старую дату lastModified . Это не изменит дату lastModified.