mysql - 从 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' 不能为空
解决方案
我不认为 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);
推荐阅读
- php - 使用 swagger-php 将嵌套属性序列化为表单数据
- linux - /proc/
/map 为busybox 显示比ldd 更多的共享库 - java - 通过 build.gradle 文件告诉 IntelliJ 为 javac 设置 -parameters 标志
- java - Prometheus jmx-exporter 是否热重载配置文件?
- javascript - 节点 Imap 获取子文件夹内容
- node.js - 过滤文档数组以返回匹配查询 Mongodb 的值
- css - Ionic 4:操作表 css 问题
- r - 使用 sparklyr 时无法在本地 Spark 连接中加载 .csv 数据
- ios - 对 uicontrol 的 nextresponder 感到困惑
- typescript - 如何根据 TypeScript 中的其他类型使对象属性可选?