timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP在一台机器上可以为null,但在另一台机器上不能为空?

时间:2014-06-13 21:49:23

标签: mysql

我有一个MySql表,其字段定义为:

`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP

在我的本地机器上,我可以运行:

INSERT INTO mytbl (id, user_id, created) VALUES(88882341234, 765, null);
SELECT id, user_id, created FROM mytbl WHERE id = '88882341234';

然后创建'将显示类似于' 2014-06-13 21:16:42'。

但是在我的登台服务器上,如果我运行相同的查询,我会收到此错误:

Column 'created' cannot be null.

表的模式是相同的(跨本地和分段),我通过mysqldump确保(在运行此测试之前克隆表)。

我在两台机器上运行MySql 5.6.17。我还确保两者都具有相同的sql_mode。

可能是什么问题?

P.S。对于那些不知道我为什么要将不可空字段的值设置为null的人,MySql Docs说:

  

此外,您可以初始化或更新任何TIMESTAMP列   通过为其分配NULL值来指定当前日期和时间,除非它已经存在   使用NULL属性定义以允许NULL值。

2 个答案:

答案 0 :(得分:36)

我发现了问题所在。 MySql变量/参数explicit_defaults_for_timestamp在我的本地计算机上为OFF,但在远程计算机上为ON。

我访问了我的AWS RDS参数组页面,并将explicit_defaults_for_timestamp从1更改为0。 然后我去了我的AWS RDS实例页面来观察"参数组"改为"申请" to" pending-reboot"。 然后我重新启动了特定的实例。

这些链接帮助了我:

答案 1 :(得分:-1)

主要问题是INSERT是错误的:它试图将NULL插入到不可为空的列中。

您应该做什么只是修复查询:

INSERT INTO mytbl (id, user_id) VALUES(88882341234, 765);

仅在登台服务器上导致错误的原因是服务器在strict SQL mode中运行,因此当您尝试向created插入不正确的值时会立即中止。

您可以使用SELECT @@SESSION.sql_mode轻松检查有效的SQL模式并更改它(可能这样您可以在自己的服务器上重现错误)

SET SESSION sql_mode = 'STRICT_ALL_TABLES'