MySQL 列类型 "TIMESTAMP"隐式包含 "NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"

标签 mysql timestamp

我刚刚花了几个小时来追踪这个错误。给定以下 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 表现得理智?

最佳答案

在 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 列类型 "TIMESTAMP"隐式包含 "NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22860351/

相关文章:

mysql - 如果记录存在或不存在,如何从多个表中获取数据

mysql - 如何在一个查询中填充一年中的所有日期?

PHP MySQL : problems with comparing timestamps in millis

java - 将时间戳转换为天数并返回会导致不同的日期

php - Laravel 合并created_at 和updated_at 时间戳

mysql - 与 Mariadb 10.2 相比,Mysql 5.5 中的查询非常慢

MYSQL 重复插入

python - 在 django 的时间戳上添加 2 小时零 1 天

mysql - 用户反馈系统的正确数据库模型(一个有趣的案例)

javascript - 将字符串时间转换为毫秒