【问题标题】:'created at' and 'updated at' fields“创建于”和“更新于”字段
【发布时间】:2011-03-24 12:58:28
【问题描述】:

这看起来很简单,但我很难弄清楚。我想要我的数据库中的一列列出第一次创建记录的时间和另一列说明它的更新时间。据我了解,我应该能够仅使用 MySQL 完成所有这些工作。感谢所有帮助:)

这个问题仍然没有答案,因为我已经开始想念 Ruby on Rails...

【问题讨论】:

  • 请详细说明您的问题,我没有发现任何明确的问题。
  • mdgrech 想要添加两个字段,其中包含表行的创建时间和更新时间。
  • +1 对我来说似乎很清楚
  • mdgrech 您将不得不使用 php 时间和 DATETIME 字段来创建列,该字段将由您的代码填充,并且您的更新列上的时间戳字段将为 DEFAULT CURRENT_TIMESTAMP,因此您不会必须更新第二个字段,并且只在创建数据时锻炼第一个字段

标签: php mysql codeigniter


【解决方案1】:

您可能需要结合使用Datetime 数据类型和Timestamp 数据类型。我会将我的created 列设置为带有DEFAULT NOW()DateTime,并将我的updated 列设置为带有DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 属性的Timestamp

这是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 子句,则自动更新;否则,它有一个恒定的默认值并且不会自动更新。

【讨论】:

  • 据我所知,您不能同时使用两者...如果您有一个带有 DEFAULT CURRENT_TIMESTAMP 的字段,则您不能有 ON UPDATE CURRENT_TIMESTAMP 事件。 #1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
  • +1:正确的方法 - 添加两列并适当设置 DEFAULT 约束。
  • 很抱歉再次让您失望,但日期时间字段也不接受默认的 NOW()...bugs.mysql.com/bug.php?id=27645
  • 所以有没有人想出这一点,因为我仍然很难过:/
【解决方案2】:

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

【讨论】:

  • 他只能使用 1 个时间戳字段,该字段将使用 mysql 自动填充,第二个需要由 php 填充。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    为了解决您的问题以及其他查看此问题的人,这里是答案。请注意,这是为 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'

    【讨论】:

      【解决方案5】:

      来自 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 属性,MySQL 会自动将 BOTH 分配给第一个 TIMESTAMP 列

      还有

      您不能对一列使用 DEFAULT CURRENT_TIMESTAMP 而对另一列使用 ON UPDATE CURRENT_TIMESTAMP

      【讨论】:

      • 此外,即使您以这种方式设置表格,然后从 phpMyAdmin 插入新行并且您未指定 current_timestamp 函数,时间也将为零时间戳。您需要在从 phpMyAdmin 添加行时指定 current_timestamp。但是,SQL 插入和更新将按预期工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 2017-08-25
      • 2021-03-10
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      相关资源
      最近更新 更多