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

这篇具有很好参考价值的文章主要介绍了【MySQL实践】一个隐蔽的问题导致 Field ‘xxx‘ doesn‘t have a default value。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 demo
    add age int null comment '年龄';
# 显示指定默认值null
alter table demo
    add age int null comment '年龄' default null;

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

alter table demo
    alter column name drop default;

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

insert into demo (status) values ( 1);

执行结果如下:
【MySQL实践】一个隐蔽的问题导致 Field ‘xxx‘ doesn‘t have a default value,# MySQL,数据库,mysql,android,数据库
问题解决:
问题已经定位复现后,再重新设置字段的默认值即可:

alter table demo
    alter column name set default null;

3.思考与总结

就像标题上说的,这个问题的隐蔽之处在于,即使是将字段的默认值drop了,在各类可视化界面中也看不出来,例如下图红框中的字段,其中name没有默认值,age字段有默认值null,但是根本看不出来:
【MySQL实践】一个隐蔽的问题导致 Field ‘xxx‘ doesn‘t have a default value,# MySQL,数据库,mysql,android,数据库
这种情况可以,可以使用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删除字段默认值,以此来避免一些意料之外的问题。文章来源地址https://www.toymoban.com/news/detail-821655.html

到了这里,关于【MySQL实践】一个隐蔽的问题导致 Field ‘xxx‘ doesn‘t have a default value的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 对文件权限误操作导致的sudo报错Sudo doesn‘t work: “/etc/sudoers is owned by uid 1000, should be 0”的问题

          系统是Ubuntu20.04,使用VsCode在局域网ssh登陆主机。 为了给ssh登陆主机的vscode提供写入权限,试图用这个命令给vscode整个etc文件夹的读取权限 然后sudo就没有办法使用了 只有一个用户,没有超级管理员,没有sudo没有办法修改权限的配置文件。 试图将权限改回全部用户的

    2024年02月12日
    浏览(34)
  • Module not found: Error: Can‘t resolve “xxx“ in “xxx“导致该问题的解决方案

    先看报错提示      根据报错提示反应的情况是:找不到模块:错误:无法解析 在遇到报错时应该仔细阅读报错提示,这样解决起来也不会没有头绪 在红色遮挡下有该报错出现的主要原因 在此处我们谈论一下解决该类报错的几种方法 1:在非路由组件中出现了图片路径,而

    2024年02月03日
    浏览(33)
  • Mysql出现问题:ERROR 1146 (42S02) Table ‘**‘ doesn‘t exist解决方案

    回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成习

    2024年02月08日
    浏览(31)
  • Cause: java.sql.SQLSyntaxErrorException: Table ‘xxx数据库.xxx表‘ doesn‘t exist

    Cause: java.sql.SQLSyntaxErrorException: Table ‘xxx数据库.xxx表‘ doesn‘t exist 这个错误通常表示在数据库中找不到指定的表。出现这个错误的原因可能有几种,包括以下情况: 表不存在:最明显的原因是表确实不存在于数据库中。这可能是由于表名拼写错误、数据库连接错误或表在数

    2024年02月05日
    浏览(33)
  • Field error in object ‘xxx‘ on field ‘xxx‘: rejected value [xx];

    字段上对象“xxx”中的field错误,拒绝了值[xxx]。意思是:在Springboot等其他框架中编写程序时,前端传入的数据例如 前端代码如下 这个phone从客户端接收的值与后端entity中定义的属性值不匹配(与数据库定义的值的类型不匹配)时,就发生接收值类型错误。 解决办法: 看是

    2024年02月10日
    浏览(114)
  • 使用postman访问springboot项目,出现Unsupported Media Type 415错误以及 Field ‘userId‘ doesn‘t have a default value

    idea控制台显示 Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘multipart/form-data;boundary=--------------------------508983844580882655519308;charset=UTF-8’ not supported] postman软件下显示 按照以前的逻辑,第一时间访问度娘,将requesthead中Content-Type改为application/json,发现没多大用

    2023年04月18日
    浏览(38)
  • Java过滤器配置类导致跨域问题:Request header field token is not allowed by Access-Control-Allow-Headers in prefli

    前端:Vue、Axios 后端:Spring Security、SpringBoot、JWT等等 报错信息如下(前端): 报错信息翻译: 在preflight响应中,Access-Control-Allow-Headers不允许请求报头字段标记。 这个翻译也让我们很快知道了问题的所在,就是Access-Control-Allow-Headers里面不允许token字段出现,也就是说,tok

    2024年02月04日
    浏览(29)
  • Centos7 开机时遇到initramfs-xxx.img not found错误导致虚拟机无法开启问题处理

    一台运行在Esxi上面的VM重启后报initramfs-xxx.img not found错误。 按任意键后出现以下错误。 之前在运维Centos7的时候解决过Kernel panic - not syncing : VFS: Unable to mount root fs on unknown-block(0.0)错误,以为按照之前的解决方案,重启服务器,按Esc进入选择内核的界面,选择中间的内核启动服

    2023年04月20日
    浏览(32)
  • mysql 启动报错 Can t change dir to xxx, No such file or directory 配置错误或挂载导致

    挂载的话,使用 /etc/fstab 放fstab里会在程序启动前加载NFS文件系统,放rc.local里往往造成程序启动加载时找不到路径。   在企业中,服务器重启,有时候会遇到mysql 启动报错 Can`t change dir to \\\'xxx\\\', No such file or directory。大致意思是无法将目录换成xxx,因为没有这个目录。 原因通

    2024年02月08日
    浏览(34)
  • Unknown column ‘xxx‘ in ‘field list‘

    MySQL数据库插入数据时,出现Unknown column \\\'XXX\\\' in \\\'field list\\\' 问题(\\\'XXX\\\'表示任意字符)。例如下面: 然后向其中插入一行数据: 控制台就会报错:Unknown column \\\'info\\\' in \\\'field list\\\' 1、该列名在数据表中不存在,也就是SQL语句中的列名写错了。 2、数据表中的列名多了一个空格,解决

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包