Así es como puede tener campos createDate / lastModified automáticos y flexibles usando disparadores:
Primero defínalos así:
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`),
)
Luego agregue estos desencadenantes:
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);
- Si inserta sin especificar createDate o lastModified, serán iguales y se establecerán en la marca de tiempo actual.
- Si los actualiza sin especificar createDate o lastModified, lastModified se establecerá en la marca de tiempo actual.
Pero aquí está la buena parte:
- Si inserta , puede especificar un createDate anterior a la marca de tiempo actual , lo que permite que las importaciones de tiempos anteriores funcionen bien (lastModified será igual a createDate).
- Si actualiza , puede especificar un LastModified anterior al valor anterior ('0000-00-00 00:00:00' funciona bien), lo que permite actualizar una entrada si está haciendo cambios cosméticos (arreglando un error tipográfico en un comentario ) y desea mantener la fecha anterior de LastModified . Esto no modificará la última fecha modificada.