【发布时间】:2014-08-04 12:58:03
【问题描述】:
我有一个 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。
可能是什么问题?
附:对于不知道我为什么要将不可为空字段的值设置为 null 的人,MySql Docs 说:
此外,您可以将任何 TIMESTAMP 列初始化或更新为 当前日期和时间通过为其分配一个 NULL 值,除非它已经 使用 NULL 属性定义以允许 NULL 值。
【问题讨论】:
-
问题可能是查询是错误的,而 MySql 正在本地机器上牵着你的手(我怀疑是由于不同的 SQL 模式有效)。如果
created不能是null,那么你到底为什么要将它设置为null? -
我认为这表示将不可为空的时间戳字段的值设置为 null 是让它自动将值设置为当前时间的一种方法:dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html 所以无论是谁最初编写了这个查询(不是我)可能是故意的。 “不同的 SQL 模式”是什么意思?如何检查和编辑它?
-
我敢打赌你的意思是dev.mysql.com/doc/refman/5.6/en/sql-mode.html。我会调查的。
-
我刚刚添加了一个答案。
-
这台服务器上是否有触发器?确保 mysqldump 中的
--triggers选项处于活动状态。
标签: mysql