我花了几个小时来追踪这个错误。给出以下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表现得很好?
答案 0 :(得分:12)
在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版本相同。
答案 1 :(得分:3)
即使未在CREATE语句中明确说明,也是正在使用的默认值。如果您想避免两者,请使用t1 TIMESTAMP DEFAULT 0
或ts1 TIMESTAMP NULL DEFAULT NULL
更新
在MySQL 5.6.5之前,您只能使用TIMESTAMP
,以防您希望在更改行时自动更新列。不幸的是,这个功能仅限于MyISAM,并且在InnoDB表上无法使用。
MySQL 5.6.5允许使用DATETIME
。有关详细信息,请参阅此网站上的其他posts