'创建于'和'更新'字段

时间:2010-08-03 04:16:14

标签: php mysql codeigniter

这看起来很简单,但我很难弄明白。我想在我的数据库中列出一个列,该列列出了第一次创建记录的时间,另一列列出了更新时间。这是我的理解我应该能够使用MySQL完成所有这些。所有帮助表示赞赏:)

这个问题仍然没有答案,原因我已经开始错过Ruby on Rails ...

5 个答案:

答案 0 :(得分:7)

您可能需要使用Datetime数据类型和Timestamp数据类型的组合。我会将created列设为DateTimeDEFAULT NOW(),将updated列设为Timestamp DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 1}}属性。

以下是Timestamp dt:

的文档

http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

  

在CREATE TABLE语句中,可以通过以下任何方式声明第一个TIMESTAMP列:

     

对于DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,该列具有其默认值的当前时间戳,并自动更新。

     

既没有DEFAULT也没有ON UPDATE子句,它与DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP相同。

     

使用DEFAULT CURRENT_TIMESTAMP子句且没有ON UPDATE子句,该列具有其默认值的当前时间戳,但不会自动更新。

     

如果没有DEFAULT子句且ON UPDATE CURRENT_TIMESTAMP子句,则该列的默认值为0并自动更新。

     

使用常量DEFAULT值时,该列具有给定的默认值,并且不会自动初始化为当前时间戳。如果该列还具有ON UPDATE CURRENT_TIMESTAMP子句,则会自动更新;否则,它具有常量默认值,不会自动更新。

答案 1 :(得分:1)

为了解决您的问题以及查看此问题的其他人,以下是答案。请注意,这是为MySQL 5.x编写的。

DROP TABLE IF EXISTS `test1`;
CREATE  TABLE `test1` (
  `id` INT NULL AUTO_INCREMENT ,
  `name` varchar(50) NOT NULL ,
  `created` DATETIME ,
  `updated` DATETIME ,
  PRIMARY KEY (`id`),
  INDEX (`name`)
);

DELIMITER $$
DROP TRIGGER IF EXISTS `test1_created`$$
CREATE TRIGGER `test1_created` BEFORE INSERT ON `test1` 
    FOR EACH ROW BEGIN
      SET NEW.`created` = UTC_TIMESTAMP();
      SET NEW.`updated` = UTC_TIMESTAMP();
    END;
$$
DROP TRIGGER IF EXISTS `test1_updated`$$
CREATE TRIGGER `test1_updated` BEFORE UPDATE ON `test1` 
    FOR EACH ROW BEGIN
      SET NEW.`updated` = UTC_TIMESTAMP();
    END;
$$
DELIMITER ;

注意

您可以将TIMESTAMP用于updated列,该列会自动更新该值,因此不需要BEFORE UPDATE触发器,但TIMESTAMP的范围从1970到2038快速接近,我想我的应用程序将永远活着:)。虽然TIMESTAMP只有4字节,而DATETIME是8字节。

TIMESTAMP range '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC

DATETIME range '1000-01-01 00:00:00' to '9999-12-31 23:59:59'

答案 2 :(得分:0)

如果您不能将时间戳字段与Paul W建议的默认属性一起使用,则可以使用AFTER INSERT和AFTER UPDATE触发器来填充字段。

答案 3 :(得分:0)

  

您需要两个字段“已创建”和   “更新”,类型为datetime。当一个   插入新条目然后插入   “创建”与当前时间戳。   发生更新时插入   使用当前时间戳“更新”,   并让“创建”字段保持为   它是。

     

您可以使用当前时间戳   你的mysql查询中的NOW()。

答案 4 :(得分:0)

来自MySQL 5.0认证指南:

CREATE TABLE ts_test5 (
  created TIMESTAMP DEFAULT 0,
  updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  data CHAR(30)
);
  

要控制TIMESTAMP列的初始化和更新行为,在使用CREATE TABLE创建表时,可以将DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性中的一个或两个添加到列定义中...   和   ...如果在创建表时没有指定DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性,MySQL会自动将BOTH分配给第一个TIMESTAMP列

另外

  

您不能将DEFAULT CURRENT_TIMESTAMP与一列一起使用,而将UPDDATE CURRENT_TIMESTAMP与另一列一起使用