我需要跟踪行插入数据库的时间以及上次修改的时间。
我尝试创建两个单独的列,并使用CURRENT_TIMESTAMP
:
create table def (
id int,
creation timestamp
default CURRENT_TIMESTAMP,
modification timestamp
on update CURRENT_TIMESTAMP
);
然而,这产生了一个错误:
错误1293(HY000):表定义不正确;在DEFAULT或ON UPDATE子句中只能有一个TIMESTAMP列和CURRENT_TIMESTAMP
这样做的最佳方式是什么?
我正在考虑存储过程,但正在寻找标准解决方案。我也关注访问权限 - 因为很少有程序/事情应该能够触及时间戳。
虽然我更喜欢MySQL的答案,但其他RDBMS的解决方案也很受欢迎!
答案 0 :(得分: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服务器的时区,而不是app服务器和mysql服务器的时区。
$sql = "INSERT INTO my_table SET name = 'Mike', created_at = NOW()";
答案 1 :(得分:2)
您可以使用触发器。应用程序也可以设置值,但如果这样做,它将被数据库覆盖。
delimiter //
CREATE TRIGGER def_bef_update BEFORE UPDATE ON def FOR EACH ROW BEGIN
SET NEW.modification = CURRENT_TIMESTAMP;
END//
delimiter ;
只有在有重大变化的情况下,您还可以使用它来检查数据并更新修改日期。