当前位置:  开发笔记 > 后端 > 正文

在MySQL 4.0中同时具有Created和Last Updated时间戳列

如何解决《在MySQL4.0中同时具有Created和LastUpdated时间戳列》经验,为你挑选了6个好方法。

我有以下表模式;

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字段?



1> Robert Gambl..:

MySQL 5.5文档:

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

MySQL 5.6.5的变化:

以前,每个表最多只能有一个TIMESTAMP列自动初始化或更新到当前日期和时间.这一限制已被取消.任何TIMESTAMP列定义都可以包含DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句的任意组合.此外,这些子句现在可以与DATETIME列定义一起使用.有关更多信息,请参阅TIMESTAMP和DATETIME的自动初始化和更新.


对于MySQL来说,这似乎有点武断.任何人都可以解释*为什么*这是这种情况?
真的很老的评论,但最终改变了:`MySQL 5.6.5的变化(2012-04-10,里程碑8)以前,每个表最多一个TIMESTAMP列可以自动初始化或更新到当前日期和时间.这一限制已被取消.任何TIMESTAMP列定义都可以包含DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句的任意组合.此外,这些子句现在可以与DATETIME列定义一起使用.有关更多信息,请参阅TIMESTAMP和DATETIME的自动初始化和更新
+1感谢文档中的官方称量.
@RobertGamble我认为更有趣的问题是为什么要注意他们没有提供这种非常普遍要求/需要的功能.

2> Bogdan Gusie..:

有两个时间戳的技巧,但有一点限制.

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

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)  


第一个代码框,当手动输入时,对我来说非常合适.谢谢!我希望我有足够的"业力"来支持这个答案,因为它拯救了我的培根.mmmmm保存培根.

3> Stephen Walc..:

您可以同时使用它们,只需在创建的字段上取下"CURRENT_TIMESTAMP"标志即可.无论何时在表中创建新记录,只需使用"NOW()"作为值.

要么.

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


这是唯一的方法吗?我不能让数据库看完所有细节吗?
根据MySql手册,CURRENT_TIMESTAMP是NOW()的同义词,所以我认为这不会起作用.
我使用插入NOW()方式,主要是因为其他代码可能触及这些表,我不相信人们正确更新它们.:)

4> webkraller..:

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

CREATE TRIGGER  BEFORE INSERT ON  FOR EACH ROW SET NEW. = CURRENT_TIMESTAMP;

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



5> alien..:

这是如何使用触发器自动和灵活的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)
)

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有