我花了几个小时来追踪这个bug.给出以下SQL:
DROP DATABASE IF EXISTS db;
CREATE DATABASE db;
CREATE TABLE db.tbl (t1 TIMESTAMP) ENGINE=INNODB;
SHOW CREATE TABLE db.tbl;
Run Code Online (Sandbox Code Playgroud)
最后一行告诉我:
'CREATE TABLE `tbl` (
`t1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1'
Run Code Online (Sandbox Code Playgroud)
它究竟NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP来自哪里?我没有写任何这些,而且我非常不想要任何这些,而且我有点迷失,因为MySQL会做出这样的假设.
我是否打开/关闭了一些疯狂的模糊配置选项?这是默认行为吗?这是一个错误吗?无论如何,我如何让MySQL表现得很好?
Eri*_*ico 14
在MySQL 5.6.5中有关于此初始化的几个更新,您可以在此链接上看到(MySQL 5.6.5之前的自动时间戳属性).
如果您使用MySQL <= 5.6.5,为了忽略此初始化,您需要将DEFAULT值设置为0或NULL,并允许NULL.
CREATE TABLE tbl
(
field1 TIMESTAMP DEFAULT 0,
field2 TIMESTAMP NULL DEFAULT NULL
)
Run Code Online (Sandbox Code Playgroud)
如果您使用的是MySQL> = 5.6.6,则会有一个名为explicit_defaults_for_timestamp的参数,默认情况下会禁用该参数.您可以启用此设置或将DEFAULT值设置为0或NULL,与以前的MySQL版本相同.
即使 CREATE 语句中没有明确说明,这些也是正在使用的默认值。如果您想避免两者,请使用t1 TIMESTAMP DEFAULT 0或ts1 TIMESTAMP NULL DEFAULT NULL
更新
在 MySQL 5.6.5 之前,您只能TIMESTAMP在希望列在行更改时自动更新的情况下使用。不幸的是,此功能仅限于 MyISAM,并且在 InnoDB 表上不可用。
DATETIMEMySQL 5.6.5也允许这样做。有关更多详细信息,请参阅本网站上的其他帖子