logger日志報錯 插入數據時違反主鍵唯一約束
org.springframework.dao.DuplicateKeyException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '189378605' for key 'PRIMARY' ### The error may involve com.ccf.springboot.mapper.middle.MiddleMapper.insertSyncBatch-Inline ### The error occurred while setting parameters ### SQL: INSERT INTO sync_batch ( uniqueId, erpId, manufactureDate, effectivityDate, batchNumber, createdDate, modifyDate ) VALUE (?,?,?,?,?,NOW( ),NOW( ) )
初步分析
在這個表中主鍵uniqueId 不是自增長 而是由erpId和batchNumber合並組成主鍵id
當有重復的主鍵id插入時報了這個異常 即插入的數據可能存在數據重復的問題 ok 那么接下來排查下sql 看看原始數據
SELECT DISTINCT goodsid, proddate, v.INVALIDDATE, lotno FROM BMS_ST_qty_LST_GAOXING_V v WHERE storageid = 10
在sql中使用了關鍵字DISTINCT 正常來說不應有重復數據產生 為了排查原因 將報錯的erpId 帶入本條sql查詢(圖一中的erpId 對應上圖的goodsid)
發現查到數據有2條
接下來去除關鍵字再試下
發現查到有3條一模一樣的數據 這就說明去重關鍵字實際上有起作用的 但是為什么有一條數據沒有去重呢
一番排查后 找到了原因
LOTNO中有一條數據后面存在空串導致 去重關鍵字沒辦法去重
解決方案
經上面查證 證實是數據維護的原因 腦海里第一個想法是修改數據 但是考慮到數據有關聯的原因 修改並不合適
但假如不修改 將查詢到的數據直接插入到sync_batch 還是會報異常
嘗試將異常抓起 不予解決 然后記錄日志 問題解決
for (SyncBatch erpSyncBatch : erpListSyncBatch) { if (erpSyncBatch.getFlag() == null) { try { middleService.insertSyncBatch(erpSyncBatch); } catch (DuplicateKeyException e) { LOGGER.error("違反唯一約束"+erpSyncBatch.getErpId()); }catch (Exception e) { LOGGER.error(ERROR_SYNC_BATCH,e); throw new RuntimeException(e); } } }