【问题标题】:Timestamp for row creation and last modification行创建和最后修改的时间戳
【发布时间】:2011-12-03 00:33:42
【问题描述】:

我需要记录一行插入数据库的时间,以及它最后一次修改的时间。

我尝试创建两个单独的列,并使用CURRENT_TIMESTAMP

create table def (
  id int, 
  creation timestamp 
    default CURRENT_TIMESTAMP, 
  modification timestamp 
    on update CURRENT_TIMESTAMP
);

但是,这产生了一个错误:

ERROR 1293 (HY000):表定义不正确;在 DEFAULT 或 ON UPDATE 子句中只能有一个带有 CURRENT_TIMESTAMP 的 TIMESTAMP 列

最好的方法是什么?

我正在考虑存储过程,但正在寻找标准解决方案。我还关心访问权限——尽可能少的程序/事物应该能够触及时间戳。


虽然我更喜欢 MySQL 的答案,但也感谢其他 RDBMS 的解决方案!

【问题讨论】:

  • 我认为修改时间戳“缺少的功能”已经在较新的 MySQL 版本之一中修复了多年。

标签: mysql sql timestamp database-trigger mysql-error-1293


【解决方案1】:

是的,这是对 MySQL 的一个蹩脚的限制。如果您正在浏览应用程序,您可以为 created_at 列添加 time() 调用,并让 updated_at 列使用 CURRENT_TIMESTAMP。

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = " . time();

我会选择在 created_at 列上执行此操作,因为它可能不会像 updated_at 列那样频繁地被触及。

-- 编辑--

更好的是,使用 MySQL 内置的 now() 函数。这样你只需要关心mysql服务器的时区,而不是app服务器和mysql服务器的时区。

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = NOW()";

【讨论】:

  • @kevin:你是对的,而且 NOW() 是首选的选择,这样你只处理 mysql 服务器的时区,而不是运行应用程序代码的服务器和 mysql 服务器.
【解决方案2】:

您可以使用触发器。应用程序也可以设置该值,但如果这样做,它将被数据库覆盖。

delimiter //
CREATE TRIGGER def_bef_update BEFORE UPDATE ON def FOR EACH ROW BEGIN
    SET NEW.modification = CURRENT_TIMESTAMP;
END//
delimiter ;

您也可以使用它来检查数据并仅在有重要更改时更新您的修改日期。

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2019-02-24
    • 2012-12-22
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多