虽然设置了默认值,但 MySQL 错误列不能为空。

4

我最近把我的SQL数据库迁移到了另一个Amazon RDS 5.7版本的服务器。

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

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

我在网上查过,人们建议将sql_mode设置为NO_ENGINE_SUBSTITUTION

我检查了现有的设置,这个也是默认设置。

我得到这个错误的其他原因是什么?有什么诀窍吗?

谢谢。


你是否升级了 MySQL 版本? - Danyal Sandeelo
我创建了一个新的RDS实例,它使用最新版本的MySQL,所以我认为是的。 - kemety
你可能需要手动传递它。 - Danyal Sandeelo
3个回答

2

1

只需停用explicit_defaults_for_timestamp

SET GLOBAL explicit_defaults_for_timestamp = 0;

0

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

根据文档所述,在应用程序运行期间,NO_ENGINE_SUBSTITUTION与错误无关。我将选择具有NULL值的“xyz”列的行并将其更新为非null的内容。

当创建行时应用Default。假设您有一个具有数百万行的表,并且希望添加不为空的列。这将使您的表在相当长的时间内被阻塞。因此,您可以创建没有非空但具有默认值的列。该操作仅涉及元数据,因此速度很快。Default将处理所有新行。之后,您可以慢慢更新所有行。最后,可以添加非空约束。不确定添加约束时DB是否检查约束。或者也许先前的版本存在此问题?在MySQL中,像这样的情况是时有发生的。


我觉得我可能没有很好地解释问题。列xyz一直存在,并且始终具有NOT NULL约束和默认值CURRENT_TIMESTAMP,没有任何NULL值行。应用程序以前用于向表中插入记录,并且默认值通常插入到字段xyz中。我没有更改应用程序中的任何内容,我所做的就是从现有数据库创建了一个转储文件,使用MySql 5.7.19创建了一个新的AWS RDS实例,然后导入了转储文件。之后,每当应用程序尝试在此表中插入记录时,我会收到此错误。 - kemety
你在插入查询中提供了 xyz 列吗?数据怎么样,重新导入后可能会有一些奇怪的东西吗?只是想弄清楚可能出了什么问题... - Michał Zaborowski
我认为问题与应用程序代码无关,迁移之前该代码运行良好。这一定是MySql的某些配置问题。 - kemety
这对我也很清楚,但是以前的版本可能允许某些东西,而现在被禁止了...这就是为什么我问是否将xyz放入插入查询中。以前的版本可能会在传递null时应用默认值,而新版本则只接受null。 - Michał Zaborowski
我完全理解,并且可能是这种情况,因为我正在使用的ORM可能正在这样做,但我不想在代码中纠正100个实例,而是要找出需要修复此问题并使其像以前一样工作的MySql配置差异。 - kemety
他们已经改变了所谓的“零日期”的支持。但这不是你的情况——错误消息是不同的。你能检查一下插入的样子吗? - Michał Zaborowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接