在MySQL 4.0中有一个创build和最后更新的时间戳列

我有以下表格架构;

CREATE TABLE `db1`.`sms_queue` ( `Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error', `CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None', `Phone` VARCHAR(14) DEFAULT NULL, `Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP, `TriesLeft` tinyint NOT NULL DEFAULT 3, PRIMARY KEY (`Id`) ) ENGINE = InnoDB; 

它失败,出现以下错误:

 ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause. 

我的问题是,我可以拥有这两个领域吗? 或者我必须在每次交易中手动设置LastUpdated字段?

MySQL 5.5文档 :

表中的一个TIMESTAMP列可以具有当前时间戳作为初始化列的默认值,作为自动更新值或两者。 不能将当前时间戳作为一列的默认值和另一列的自动更新值。

MySQL 5.6.5的变化 :

以前,每个表最多有一个TIMESTAMP列可以自动初始化或更新为当前的date和时间。 这个限制已经解除了。 任何TIMESTAMP列定义都可以具有DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句的任意组合。 另外,这些子句现在可以和DATETIME列定义一起使用。 有关更多信息,请参阅自动初始化和更新TIMESTAMP和DATETIME。

有两个时间戳的窍门 ,但有一个小小的限制。

您只能在一个表中使用其中一个定义。 像这样创build两个时间戳列:

 create table test_table( id integer not null auto_increment primary key, stamp_created timestamp default '0000-00-00 00:00:00', stamp_updated timestamp default now() on update now() ); 

请注意,在insert期间,有必要在两列中inputnull

 mysql> insert into test_table(stamp_created, stamp_updated) values(null, null); Query OK, 1 row affected (0.06 sec) mysql> select * from test_table; +----+---------------------+---------------------+ | id | stamp_created | stamp_updated | +----+---------------------+---------------------+ | 2 | 2009-04-30 09:44:35 | 2009-04-30 09:44:35 | +----+---------------------+---------------------+ 2 rows in set (0.00 sec) mysql> update test_table set id = 3 where id = 2; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from test_table; +----+---------------------+---------------------+ | id | stamp_created | stamp_updated | +----+---------------------+---------------------+ | 3 | 2009-04-30 09:44:35 | 2009-04-30 09:46:59 | +----+---------------------+---------------------+ 2 rows in set (0.00 sec) 

你可以拥有它们,只要在创build的字段上取下“CURRENT_TIMESTAMP”标志即可。 每当您在表格中创build新logging时,只需使用“NOW()”作为值即可。

要么。

相反,删除'ON UPDATE CURRENT_TIMESTAMP'标志并发送NOW()给该字段。 这种方式实际上更有意义。

如果你决定让MySQL处理时间戳的更新,你可以设置一个触发器来更新插入的字段。

 CREATE TRIGGER <trigger_name> BEFORE INSERT ON <table_name> FOR EACH ROW SET NEW.<timestamp_field> = CURRENT_TIMESTAMP; 

MySQL参考: http : //dev.mysql.com/doc/refman/5.0/en/triggers.html

这是如何使用触发器自动和灵活的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'),允许更新一个条目,如果你在做整容修改(修复评论中的拼写错误),你想保留旧的lastModifieddate。 这不会修改lastmodifieddate。

从MySQL 5.6开始,它简单易用,试试吧:

 create table tweet ( id integer not null auto_increment primary key, stamp_created timestamp default now(), stamp_updated timestamp default now() on update now(), message varchar(163) ) 

这个问题似乎已经在MySQL 5.6中解决了。 我已经注意到,直到MySQL 5.5; 这里是一个示例代码:

 DROP TABLE IF EXISTS `provider_org_group` ; CREATE TABLE IF NOT EXISTS `provider_org_group` ( `id` INT NOT NULL, `name` VARCHAR(100) NOT NULL, `type` VARCHAR(100) NULL, `inserted` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `insert_src_ver_id` INT NULL, `updated` TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP, `update_src_ver_id` INT NULL, `version` INT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `id_UNIQUE` (`id` ASC), UNIQUE INDEX `name_UNIQUE` (`name` ASC)) ENGINE = InnoDB; 

在MySQL 5.5上运行这个function给出:

 ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause 

在MySQL 5.6上运行这个

 0 row(s) affected 0.093 sec 
 create table test_table( id integer not null auto_increment primary key, stamp_created timestamp default '0000-00-00 00:00:00', stamp_updated timestamp default now() on update now() ); 

来源:http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/