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

  

猜你喜欢

转载自www.cnblogs.com/1vs10/p/9227875.html