首页 > 解决方案 > 从 MySQL 5.7 升级到 MySQL 8 后,无法将 NULL 值插入到 NOT NULL 日期字段

问题描述

我从 MySQL 5.7.26 升级到 8.0.20。

其中一张表没有 TIMESTAMP 数据类型的空列,默认值为 CURRENT_TIMESTAMP。

在 5.7.26 上,如果运行了如下所示的插入语句,它会成功执行,并且使用默认值(即 CURRENT_TIMESTAMP)填充非空列。

mysql>insert into test_field ( object_type, dataType, fieldSize, hiddenFlag , fieldLabel, fieldName, modified_date) values ('LEAD', 13, 44, 1, 'Date Last Updated_testing1', 'test_Insert_test1', NULL);

查询正常,1 行受影响,1 个警告(0.00 秒)

升级到 8.0.20 后,出现错误:

mysql>insert into test_field ( object_type, dataType, fieldSize, hiddenFlag , fieldLabel, fieldName, modified_date) values ('LEAD', 13, 44, 1, 'Date Last Updated_testing1', 'test_Insert_test1', NULL);

错误 1048 (23000):列 'modified_date' 不能为空

标签: mysqlsql-insertmysql-5.7mysql-8.0sql-null

解决方案


我不认为 MySQL 关于插入到设置了值null的非nullable列的行为在 5.7 和 8.0 版本之间发生了变化。default但是,据记录,在这种情况下发生的情况取决于是否启用了严格模式:

  • 如果启用了严格的 SQL 模式,则事务表会发生错误并回滚语句。对于非事务性表,会发生错误,但如果多行语句的第二行或后续行发生这种情况,则会插入前面的行。

  • 如果未启用严格模式,MySQL 会将列设置为列数据类型的隐式默认值。

可能,您的全新 8.0 安装启用了严格模式,而您在 5.7 数据库中禁用了它。

一种可能的解决方法是使用DEFAUT而不是NULL

insert into test_field (object_type, dataType, fieldSize, hiddenFlag , fieldLabel, fieldName, modified_date) 
values ('LEAD', 13, 44, 1, 'Date Last Updated_testing1', 'test_Insert_test1', DEFAULT);

推荐阅读