項目場景:
數據庫環境 :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’, , )
修復后沒有再次報錯。