DISTINCT 去重仍有重復的分析


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);
                }
            }
        }

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM