尽管设置了默认值,但MySQL错误列不能为空

时间:2018-01-04 07:39:50

标签: mysql

我最近将我的SQL数据库移动到另一个版本为5.7的Amazon RDS服务器。

在此之前,应用程序运行正常,但现在我开始记录错误:

  

" ER_BAD_NULL_ERROR:列xyz不能为空" - 该列已具有默认值CURRENT_TIMESTAMP

我在网上查了一下,人们建议让sql_mode等于NO_ENGINE_SUBSTITUTION

我检查了现有设置,它已经是这样了。

我收到此错误的任何其他原因?任何技巧?

感谢。

3 个答案:

答案 0 :(得分:1)

只需停用explicit_defaults_for_timestamp

SET GLOBAL explicit_defaults_for_timestamp = 0;

答案 1 :(得分:0)

我不知道为什么它在这种特殊情况下会像那样工作,所以我会集中精力解决问题。

根据docs NO_ENGINE_SUBSTITUTION与应用程序运行期间的错误无关。我会选择列为“xyz”NULL值的行并将其更新为某些内容 - 不为null。

创建行时应用

Default。假设您有一个包含数百万行的表,并希望添加非空的列。这会在很长一段时间内阻止你的桌子。因此,您可以创建列而不是null,但默认情况下。该操作仅处理元数据,因此速度很快。 Default将处理所有新行。之后,您可以慢慢更新所有行。最后,可以添加非空约束。在最后一步添加DB时,不确定DB是否正在检查约束。或者也许是上一个版本有问题吗?有了MySQL,就会发生这样的事情。

答案 2 :(得分:0)

搜索更多后,问题仅出现在current_timestamp默认值的时间戳字段中。我在参数中搜索并找到了已启用的 explicit_defaults_for_timestamp (值为1),并且通过更多的研究,我不得不根据此处的文档禁用此参数

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp

以获得所需的结果并解决问题。