【MySQL实践】一个隐蔽的问题导致 Field ‘xxx‘ doesn‘t have a default value

文章目录

  • 1.背景
  • 2.问题处理
  • 3.思考与总结

1.背景

最后在公司的后台系统上遇到了一个线上问题,是在插入某个表数据的时候出现了数据库的插入异常,即:java.sql.SQLException: Field 'xxx' doesn't have a default value,这其实是一个比较常见的异常,一般在字段不能为null时,如果没有显式的指定对应字段的值就会抛出这个异常。

但是今天遇到的这个异常原因还不是这样的,实际原因有点隐蔽,所以在这里记录一下今天遇到的这个问题。

2.问题处理

下面以一张Demo表为例来进行说明,有一个可以为null的字段与一个不能为null的字段。

create table demo
(id     bigint auto_increment comment '主键' primary key,name   varchar(64) null comment '名称',status tinyint     not null comment '状态'
);

问题排查:
就像在背景中提到的,当字段不能为null时,很容易触发上述的异常,于是在第一时间检查DDL,发现字段name可以为空。这就奇怪了,正常情况下不会出现这个问题,于是怀疑这种可以为空的字段,在某种特殊情况会导致没有默认值的异常。

于是通过搜索引擎和GPT提出了我的问题,当时问题聚焦于null和非null字段上,得到的结果基本上都指向了可以为null的字段不会出现这个问题。

转换思路:
搜索无果后,尝试转换了一下思路,再重新关注一下问题的描述 Field 'xxx' doesn't have a default value,当时灵光一闪,提示已经非常清晰了没有默认值。经过测试发现,在建表和新增字段的时候,对于可以为null的字段,即使是没有显示的指定一个deafult,也会自动分配一个默认值null
也就是说,下面两个ddl是等价的。

# 不显示指定默认值
alter table demoadd age int null comment '年龄';
# 显示指定默认值null
alter table demoadd age int null comment '年龄' default null;

既然问题没有出现在字段的创建上,那多半是后期在对数据库修数的时候,删除了字段的默认值。于是去查看了一下数据库的工单申请列表,果然发现了端倪,有这么一个ddl

alter table demoalter column name drop default;

问题复现:
尝试在测试环境执行这条sql,并通过insert语句在不显示指定name字段的情况下,插入一条数据:

insert into demo (status) values ( 1);

执行结果如下:
在这里插入图片描述
问题解决:
问题已经定位复现后,再重新设置字段的默认值即可:

alter table demoalter column name set default null;

3.思考与总结

就像标题上说的,这个问题的隐蔽之处在于,即使是将字段的默认值drop了,在各类可视化界面中也看不出来,例如下图红框中的字段,其中name没有默认值,age字段有默认值null,但是根本看不出来:
在这里插入图片描述
这种情况可以,可以使用SHOW CREATE TABLE demo;获取原始的建表语句:

CREATE TABLE `demo` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(64) COMMENT '名称',`status` tinyint(4) NOT NULL COMMENT '状态',`age` int(11) DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4

这里就可以看到nameage字段的默认值区别了。


最后是一些思考和总结:

  • 如果没有显式的指定字段默认值,在创建字段的时候会自动将默认值指定为null
  • not null字段,无法自动指定默认值,需要显示的指定。
  • 可以使用SHOW CREATE TABLE demo;查看原始的建表语句,能直接看到默认值是否存在。

最后,如果需要修改默认值,将期设置为一个具体的值(哪怕设置为null),尽可能的不要使用drop default删除字段默认值,以此来避免一些意料之外的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaweb-js-vue基础知识(持续更新中)

sshu 双向数据绑定 ---------------------------------------------------------- 注意淘宝镜像最新网址发生变化,记得改,不是老师现在用的那个,不然会下载出错!!! 没有的:ctrlshiftp&#xff…

apipost和curl收不到服务器响应的HTTP/1.1 404 Not Found

windows的apipost发送请求后,服务器响应了HTTP/1.1 404 Not Found,但是apipost一直显示发送中。 linux上的curl也一样。 使用wireshark抓包发现收到了响应,但是wireshark识别不了(图中是回应404后关闭了连接)&#xff…

Chatgpt的崛起之路

Chatgpt的崛起之路 背景与发展历程背景发展历程 技术原理第一阶段:训练监督策略模型第二阶段:训练奖励模型第三阶段:采用强化学习来增强模型的能力。 国内使用情况及应用的领域面临的数据安全挑战与建议ChatGPT获取数据产生的问题数据泄露问题…

接口自动化测试:mock server之Moco工具

什么是mock server mock:英文可以翻译为模仿的,mock server是我们用来解除依赖(耦合),假装实现的技术,比如说,前端需要使用某些api进行调试,但是服务端并没有开发完成这些api&#…

测试人年终总结:入行三年,下一步怎么走,思想碰撞

原贴地址:入行三年,下一步怎么走,思想碰撞 TesterHome 熟悉环境,进步缓慢;停止思考,举步不前(为什么会有这篇文章why 初心变质:计算机系毕业,毕业时的打算是从测试进&a…

程序员如何保持身心健康

程序员要保持身心健康,可以注意以下几个方面: 饮食健康:保持均衡的饮食,多吃蔬菜水果,减少油腻和高热量食物的摄入。同时,适当饮水,避免因长时间坐着工作而导致的脱水。尽量不要吃街边摊、大排…

#常见问题总结#在docker中跑前端vue项目

目录 前言一、no such file or directory, open...总结 前言 提示:这里可以添加本文要记录的大概内容: 记录在docker中跑前端项目过程中,我遇到的问题以及解决方法 提示:以下是本篇文章正文内容,下面案例可供参考 一…

大数据数据可视化工具ECharts,从入门到精通!

介绍:ECharts是一个强大的数据可视化图表库,它基于JavaScript开发,并具有丰富的特性和灵活性。 多平台支持:ECharts可以在PC和移动设备上流畅运行,它对移动端进行了优化,确保在不同设备上都有良好的展示效果…

为什么游戏公司开发一个游戏需要上亿资金

** 为什么游戏公司开发一个游戏需要上亿资金 ** 游戏界有句老话:要做游戏,没上亿准备别来碍手碍脚。说直白点,就是要想在这个竞争激烈的蓝海里立足,开发一款像模像样的游戏,需要有几亿元的资金准备。 可能有人会觉得…

互联网泛人才流动报告:大厂扩张按下暂停键,这家公司逆势给出5w月薪招人

前段时间,脉脉高聘人才智库发布了《2023年互联网泛人才流动报告》,似乎佐证了23年是互联网真正的寒冬…… 卷生卷死!5个人竞争2个岗位 2023年,互联网行业的求职难度可以说是地狱级别,人才供需比持续上升,…

什么是Spring

文章目录 什么是Spring什么是 IoC Spring的IoCDI的概念 什么是Spring Spring 是一个包含了众多工具方法的 IoC容器。 什么是 IoC Inversion of Control — 控制反转 在传统的开发中,假设A类依赖于B类,那么创建A对象实例就需要先new一个B类对象&#x…

分享本机搭建《幻兽帕鲁》服务,并可以外网联机的方法

由于《幻兽帕鲁》玩家好评率也高达93%,天卖出600万份,爆火游戏幻兽帕鲁最高180万人同时在线,直接登顶,也有不少玩家从中体会到了难得的“当老板”的乐趣。官方虽然支持联机人数更多,但是由于游戏过于火爆,服…

瑞_力扣LeetCode_101. 对称二叉树

文章目录 题目 101. 对称二叉树题解方式一 递归方式二 迭代 🙊 前言:本文章为瑞_系列专栏之《刷题》的力扣LeetCode系列,主要以力扣LeetCode网的题进行解析与分享。本文仅供大家交流、学习及研究使用,禁止用于商业用途&#xff0c…

代码随想录算法训练营第十六天| 104.二叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

104.二叉树的最大深度 本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。 ●二叉树节点的深度:指从根节点到该节点的最长简单路径边…

Java Web(四)--JavaScript

介绍 JavaScript 教程 JavaScript 能改变 HTML 内容,能改变 HTML 属性,能改变 HTML 样式 (CSS),能完成页面的数据验证; JS 需要运行浏览器来解析执行JavaScript 代码; JS 是 Netscape 网景公司的产品&#xf…

深入了解Figure的结构与层次

深入了解Figure的结构与层次 一 Matplotlib中的Figure1.1 Figure的概念和作用:1.2.创建Figure对象:1.3 Figure的属性和方法: 二 子图(Axes)的角色与创建2.1 子图(Axes)的概念:2.2 创建子图的方法:2.3 Axes的…

使用visual studio写一个简单的c语言程序

官网下载visual studio,社区版免费的 https://visualstudio.microsoft.com/zh-hans/ 下载好以后选择自己的需求进行安装,我选择了两个,剩下的是默认。 创建文件:

嵌入式面试提问

嵌入式面试问题 1.讲一下STM32的时钟系统 现总结下:首先是时钟源输入时钟信号到单片机,然后单片机对输入的时钟信号进行倍频和分频处理,再将处理后的时钟信号输出至系统,外设或外部接口。   先看这张图,最外面的线上…

第三篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:添加页面和页面路由

传奇开心果短博文系列 系列短博文目录鸿蒙开发技术点案例示例短博文系列 短博文目录一、前言二、编写第一个页面Index.ets 示例代码三、编写第二个页面Second.ets示例代码四、第一个页面Index.ets 跳转到第二个页面Second.ets 示例代码五、第二个页面Scond.ets返回第一个页面In…

[C#]winform部署yolov7+CRNN实现车牌颜色识别车牌号检测识别

【官方框架地址】 https://github.com/WongKinYiu/yolov7.git 【框架介绍】 Yolov7是一种目标检测算法,全称You Only Look Once version 7。它是继Yolov3和Yolov4之后的又一重要成果,是目标检测领域的一个重要里程碑。 Yolov7在算法结构上继承了其前…