【问题标题】:MySQL column type "TIMESTAMP" implicitly includes "NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"MySQL 列类型“TIMESTAMP”隐式包含“NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”
【发布时间】:2014-04-04 10:33:41
【问题描述】:

我刚刚花了几个小时来追踪这个错误。给定以下 SQL:

DROP DATABASE IF EXISTS db;
CREATE DATABASE db;
CREATE TABLE db.tbl (t1 TIMESTAMP) ENGINE=INNODB;
SHOW CREATE TABLE db.tbl;

最后一行告诉我:

'CREATE TABLE `tbl` (
  `t1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1'

NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 到底是从哪里来的?我没有写任何这些,而且我非常不想要任何这些,而且我有点迷失了 MySQL 会做出这样的假设的话。

我是否打开/关闭了一些疯狂的晦涩配置选项?这是默认行为吗?这是一个错误?无论如何,我怎样才能让 MySQL 表现得理智?

【问题讨论】:

  • 您可能想要datetime 而不是timestamptimestamp 用于版本控制记录,如果记录更新,默认行为是更新该列。
  • @juergend 谢谢。 The MySQL documentation 并没有明确说明这就是 TIMESTAMP 类型的用途。写该文件的人应该被带到外面并枪杀。
  • 我想你已经知道了,但文档说 «TIMESTAMP 数据类型提供自动初始化和更新到当前日期和时间» 并链接到 Automatic Initialization and Updating for TIMESTAMP。作家不应该超过一句话。
  • @ÁlvaroG.Vicario 我只是偶然发现了这种行为并阅读了文档,但我没想到offer会强加给我 ;-)

标签: mysql timestamp


【解决方案1】:

在 MySQL 5.6.5 中有几个关于这个初始化的更新,你可以在这个link 上看到(MySQL 5.6.5 之前的自动时间戳属性)。

如果您使用的是 MySQL 5.6.5,为了忽略此初始化,您需要将 DEFAULT 值设置为 0 或 NULL 并允许 NULL。

CREATE TABLE tbl
(
    field1 TIMESTAMP DEFAULT 0,
    field2 TIMESTAMP NULL DEFAULT NULL
)

如果您使用 MySQL >= 5.6.6,则有一个名为 explicit_defaults_for_timestamp 的参数默认禁用。您可以启用此设置或将 DEFAULT 值设置为 0 或 NULL,与以前的 MySQL 版本相同。

如果您使用的是 MySQL >= 8.0.2,则默认情况下,explicit_defaults_for_timestamp已启用。这会禁用非标准行为(谢天谢地)。此外,当您禁用此设置时,MySQL 会生成警告。因此,例如,如果您没有为 TIMESTAMP 列定义 DEFAULT 值,它会自动设置为 NULL

【讨论】:

  • 值得一提的是,MySQL 只为表中的 first TIMESTAMP 列添加了这些默认值,甚至在 5.6.5 之前
【解决方案2】:

这些是默认值,即使在 CREATE 语句中没有明确说明,也会使用它们。如果您想同时避免这两种情况,请使用t1 TIMESTAMP DEFAULT 0ts1 TIMESTAMP NULL DEFAULT NULL

更新

在 MySQL 5.6.5 之前,您只能使用TIMESTAMP,以防您希望在更改行时自动更新列。不幸的是,此功能仅限于 MyISAM,并且不适用于 InnoDB 表。

MySQL 5.6.5 也允许使用DATETIME。有关更多详细信息,请参阅本网站上的其他 posts

【讨论】:

  • 谢谢,虽然这些选项看起来都不像我想要的:我想要 TIMESTAMP NOT NULL 没有默认值,也没有任何疯狂的更新触发器。我该如何指定?
  • 这些是唯一的选择。
  • @jameshfisher 知道 DATETIME 中缺少您需要使用的 TIMESTAMP 的哪些确切功能,这会有所帮助。或许我们可以想出一个替代方案。
  • @ÁlvaroG.Vicario 不,DATETIME 很好。 TIMESTAMP 有这些任意的限制、令人发指的不直观的规范选项以及文档不清楚,这让我很恼火。
  • 我编辑了答案以解释 DATETIMETIMESTAMP 之间的主要区别。
猜你喜欢
  • 2014-03-16
  • 2016-10-23
  • 1970-01-01
  • 2017-04-26
  • 2016-05-30
  • 2011-07-31
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
相关资源
最近更新 更多