【问题标题】:Database timestamps in sqlsql中的数据库时间戳
【发布时间】:2016-04-25 22:26:21
【问题描述】:

在 MySQL 中创建数据库表。我创建了两个字段来获取时间戳。

created_at          timestamp default '0000-00-00 00:00:00',
updated_at          timestamp default now() on update now(),

当我更新数据库时,两个字段都更新为当前时间戳。关于如何防止这种情况发生的任何想法?我更新时没有提供“created_at”字段——我还为 updated_at 字段提供“null”以自动更新。

【问题讨论】:

标签: mysql sql database


【解决方案1】:

根据 MySQL 的版本,您应该能够在 updated_at 字段中使用以下默认值:

更新 CURRENT_TIMESTAMP 上的 CURRENT_TIMESTAMP

您的 created_at 字段应该只有 CURRENT_TIMESTAMP 作为默认值。

我还将两者都设置为数据类型 datetime 而不是时间戳。

【讨论】:

  • 他不希望它默认为当前时间,他希望它默认为时间0。
  • @Barmar - 我看到他当前的声明是没有 created_at 的日期时间值,但这毫无价值。他需要在创建时将其默认为当前日期时间值。另一个选项是将数据类型更改为 datetime 并默认为 NULL。
  • @ReubenBrown 上面的代码是我在尝试使其工作时发现的。我不能有两个 current_timestamp(或 now()) 声明而不会出错。我真的很希望这是一件自动的事情——不希望在创建时提供当前时间戳。
  • @Spencer-Rohan :我从之前的评论中看到您使用的是 MySQL 5.6.4。我在社区版本 5.6.23 上有一个数据库表,它让我有我建议的确切声明。它将两个字段初始化为当前日期/时间值,然后在更新时仅更新第二个字段。您不应尝试为任一字段提供更新值,因为它们由数据库管理。您可能希望将 created_at 字段设置为“日期时间”而不是时间戳,以查看它是否能给您带来更好的结果。
【解决方案2】:

时间戳初始化在 mysql 中可能是一个丑陋的野兽!

根据下面的评论,您拥有 mysql v5.6.4 或更早版本:

我不能在没有错误的情况下声明两个 current_timestamp——尽管它的默认值为 0——它会在创建时生成当前时间戳(无需我输入时间戳)——Spencer Rohan

当您插入/更新记录时,您可以拥有一个已初始化和/或更新为当前时间戳的时间戳字段。在早期版本中,这必须是表中的第一个时间戳字段。

我只需将created_at 设置为可空列,默认值为null,因为根据timestamp initialization 上的mysql 文档:

换句话说,定义为允许 NULL 值的 TIMESTAMP 列仅在其定义包含 DEFAULT CURRENT_TIMESTAMP 时才会自动初始化

通过将默认值更改为 null,您可以解决零日期和各种 sql 模式可能遇到的任何问题。

created_at          timestamp null default null,

【讨论】:

  • 我不能在没有错误的情况下声明两个 current_timestamps -- 尽管它的默认值为 0 -- 它会在创建时生成当前时间戳(没有我输入时间戳)
  • “我不能声明两个 current_timestamps 而不会出错” - 所以您使用的是 mysql v5.6.4 或更早版本。我会相应地更新我的答案。尽管我关于可空性的回答的要点仍然存在。
  • 您的解决方案的值为 NULL
  • 这就是它应该做的,如果你将 null 传递给时间戳字段。您正在传递一个空值,这就是导致它首先被设置为 current_timestamp 的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2010-10-21
  • 2012-05-23
相关资源
最近更新 更多