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)
发现查到数据有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); } } }
上一篇: mysql数据备份
下一篇: 浅谈 SpringMVC入门
推荐阅读
-
JavaScript使用indexOf()实现数组去重的方法分析
-
JS实现数组去重,显示重复元素及个数的方法示例
-
Java8利用stream的distinct()方法对list集合中的对象去重和抽取属性去重
-
Java8利用stream的distinct()方法对list集合中的对象去重和抽取属性去重
-
JS实现数组去重,显示重复元素及个数的方法示例
-
Python实现的删除重复文件或图片功能示例【去重】
-
Oracle列转行函数Listagg()查询结果的去重(去除重复值)的方法详解
-
pandas 实现将重复表格去重,并重新转换为表格的方法
-
PHP二维数组去重的方法(保留各个键值的同时去除重复的项)-- 二维数组的唯一性
-
利用Distinct()内置方法对List集合的去重问题详解