MySQL Datetime&行级别和表级别的时间戳

时间:2010-11-15 17:30:41

标签: mysql database datetime timestamp

我需要在所有表格中有三列,以根据要求反映这些:

  • 创建日期/时间 - >日期和时间 行已创建。这个值应该 永远不会改变。
  • 修改日期/时间 - >仅限日期和时间 最后修改了该行的某些部分。 如果有的话,该值将始终更改 行中的细节已更改。
  • 更新日期/时间 - >日期和时间 整行最后一次更新。这个 如果全部价值将永远改变 行中的详细信息已更改。

此外,我需要保持相同的细节,但在表级 - >
  - 创建日期/时间表
  - 插入最后一行的日期/时间
  - 上次编辑发生的日期/时间。

所以有两个问题:

1)对于3行日期/时间的情况:哪一个需要是日期时间,哪一个是时间戳?
2)对于3个表级日期/时间:我可以以某种方式将其存储在同一个表中,还是需要一个单独的表来存储此信息,以及我可以使用哪些功能?

最终目标是自动化这些日期/时间,因为最终用户将从前端输入/编辑大量数据,例如查找表,因此我需要DB在后面自己完成所有日期/时间没有任何手动插入这些colunms。

此外,我需要对这些日期/时间进行报告,因此需要确保可以在代码级别操作它们,以将日期/时间分解为天,周,月,年,小时和时间。分钟。

2 个答案:

答案 0 :(得分:1)

我害怕,这是不可能的。这是一个非常愚蠢的缺点,但in the docs它说:

  

对于表中的一个TIMESTAMP列,   您可以分配当前时间戳   作为默认值和   自动更新值。有可能   将当前时间戳设为   初始化的默认值   列,用于自动更新值,或   都。这是不可能的   当前时间戳是默认值   一列和自动更新   另一列的价值。

表级时间戳和报告可以使用MAX()GROUP BY直接完成。

答案 1 :(得分:0)

如果要完全使用SQL执行此操作,而不是计算应用程序代码中的更新时间戳,则必须添加另一个表。您的主表只有一个时间戳字段 - 创建日期,默认为CURRENT_TIMESTAMP且永远不会更改。你的第二个表main_updates将是这样的:

CREATE TABLE main_updates(
main_id INT UNSIGNED NOT NULL REFERENCES main(main_id),
update_type ENUM('partial','complete'),
update_time TIMESTAMP DEFAULT CURRENT TIMESTAMP) 

然后你有一个选择。如果您想要记录所有已完成的更新,请不要设置主键,只能INSERT到此表中。如果您只想记录最新值,请将主键设置为main_id和update_type,并将update_time设置为ON UPDATE CURRENT_TIMESTAMP

然后,只要更新main,就可以编写触发器。

但实际上,让应用层设置更新时间要容易得多。