2011-12-03 50 views
6

我需要跟踪行被插入数据库的时间以及上次修改的时间。行创建和上次修改的时间戳

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

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

然而,这产生了一个错误:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

什么是做到这一点的最好方法是什么?

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


虽然我更喜欢MySQL的答案,其他RDBMS的解​​决方案也赞赏!

+0

我认为修改时间戳“缺少的功能”已在多个当前的MySQL版本之后的几年中修复。 – hakre

回答

3

雅这是对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服务器的时区,而不是应用服务器和mysql服务器的时区。

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

关于使用'CURRENT_TIMESTAMP'的哪个列的好处。 –

+1

如果我没有错,你也可以使用MySQL的NOW()命令。 – Kevin

+1

@kevin:你是对的,而且tbh,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 ; 

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