项目场景:
数据库环境 :mysql8;
工程使用:MyBatisPlus
表情况:
问题描述
某一个插入语句使用了 MyBatisPlus 的 save 方法,因为end_time1 end_time2都并没有值,所以在MyBatisPlus默认情况下,并不会在插入语句中提及,
最终提取其SQL: INSERT INTO aaaa (serial_no, business_date, market_no, report_code)
VALUES (31, 20230704, 1, ‘688610’)
结果报错 Field 'end_time1' doesn't have a default value
。
一般情况下,这种报错是表设置成非空字段,我们又没设置默认值导致的。但是这里我们明明表中设置了可空。而且该场景为偶现,我们单独把SQL提取出来执行又是可以的,排查数小时无果。
原因分析:
偶现,目前无法查出其原因,可能需要去Mysql源码来看原因了
解决方案:
既然说的是没有默认值,那我们就在插入的时候指定传null 进去即可,由于MyBatisPlus的特性,所以最终在DBclass层,为end_time1和end_time2都设置为null 也插入和更新
该参数的运行原理可见往期博文《MybatisPlus 构造器wrapper的使用与原理》 中的“易错点-null处理”小节
最终生成的SQL如下:
INSERT INTO aaaa ( serial_no, business_date,
market_no, report_code, end_time1, end_time2 ) VALUES ( 63, 20230704,
1, ‘688610’, , )
修复后没有再次报错。