我最近将我的SQL数据库移动到另一个版本为5.7的Amazon RDS服务器。
在此之前,应用程序运行正常,但现在我开始记录错误:
" ER_BAD_NULL_ERROR:列xyz不能为空" - 该列已具有默认值CURRENT_TIMESTAMP
我在网上查了一下,人们建议让sql_mode
等于NO_ENGINE_SUBSTITUTION
我检查了现有设置,它已经是这样了。
我收到此错误的任何其他原因?任何技巧?
感谢。
答案 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),并且通过更多的研究,我不得不根据此处的文档禁用此参数
以获得所需的结果并解决问题。