我有一个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值。
答案 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'