DISTINCT 去重仍有重复的分析
程序员文章站
2022-06-24 13:06:55
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); } } }
上一篇: pyhon之99乘法表
下一篇: 第四章 运算符重载
推荐阅读
-
pandas 实现将重复表格去重,并重新转换为表格的方法
-
PHP二维数组去重的方法(保留各个键值的同时去除重复的项)-- 二维数组的唯一性
-
利用Distinct()内置方法对List集合的去重问题详解
-
Mysql中distinct与group by的去重方面的区别
-
Hive中的去重 :distinct,group by与ROW_Number()窗口函数
-
mongodb中使用distinct去重的简单方法
-
用python删除文件夹中的重复图片(图片去重)
-
P1059 明明的随机数 排列好的数组如何去重统计,如何去除数组重复的数字
-
Excel两列去重方法(一列中的内容在另一列中是否重复)
-
Excel两列去重方法(一列中的内容在另一列中是否重复)