我有以下表模式;
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列自动初始化或更新到当前日期和时间.这一限制已被取消.任何TIMESTAMP列定义都可以包含DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句的任意组合.此外,这些子句现在可以与DATETIME列定义一起使用.有关更多信息,请参阅TIMESTAMP和DATETIME的自动初始化和更新.
有两个时间戳的技巧,但有一点限制.
您只能在一个表中使用其中一个定义.像这样创建两个时间戳列:
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() );
请注意,null
在以下期间必须输入两列insert
:
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)
您可以同时使用它们,只需在创建的字段上取下"CURRENT_TIMESTAMP"标志即可.无论何时在表中创建新记录,只需使用"NOW()"作为值.
要么.
相反,删除'ON UPDATE CURRENT_TIMESTAMP'标志并为该字段发送NOW().这种方式实际上更有意义.
如果您决定让MySQL处理时间戳的更新,您可以设置触发器来更新插入字段.
CREATE TRIGGERBEFORE INSERT ON FOR EACH ROW SET NEW. = 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
如果在未指定createDate或lastModified的情况下插入,则它们将相等并设置为当前时间戳.
如果在未指定createDate或lastModified的情况下更新它们,则lastModified将设置为当前时间戳.
但这是很好的部分:
如果插入,则可以指定早于当前时间戳的createDate,从而允许从较旧时间导入效果良好(lastModified将等于createDate).
如果你更新,你可以指定一个比上一个值更早的lastModified('0000-00-00 00:00:00'效果很好),如果你正在进行整容修改,可以更新一个条目(在评论中修正拼写错误) )并且您希望保留旧的lastModified日期.这不会修改lastModified日期.
6> Shaheen Ghia..:从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) )