Ось як можна мати автоматичні та гнучкі поля 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, остання зміна буде встановлена на поточну позначку часу.
Але ось приємна частина:
- Якщо ви вставите , ви можете вказати createDate, старший за поточну часову позначку , що дозволить імпорту зі старих часів працювати добре (lastModified буде дорівнює createDate).
- Якщо ви оновлюєтесь , ви можете вказати lastModified старше попереднього значення ("0000-00-00 00:00:00" працює добре), що дозволяє оновити запис, якщо ви робите косметичні зміни (виправляючи помилку в коментарі ), і ви хочете зберегти стару останню змінену дату. Це не змінить дату останньої модифікації.