欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

DISTINCT 去重仍有重复的分析

程序员文章站 2022-03-21 19:41:49
logger日志报错 插入数据时违反主键唯一约束 初步分析 在这个表中主键uniqueId 不是自增长 而是由erpId和batchNumber合并组成主键id 当有重复的主键id插入时报了这个异常 即插入的数据可能存在数据重复的问题 ok 那么接下来排查下sql 看看原始数据 在sql中使用了关键 ......

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) 

DISTINCT 去重仍有重复的分析

发现查到数据有2条

接下来去除关键字再试下

DISTINCT 去重仍有重复的分析

发现查到有3条一模一样的数据  这就说明去重关键字实际上有起作用的 但是为什么有一条数据没有去重呢 

一番排查后 找到了原因

DISTINCT 去重仍有重复的分析

 

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