我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘xxx‘ for key ‘xxx‘错误的解决方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘xxx‘ for key ‘xxx‘错误的解决方法

文章目录

1. 复现错误


今天写好导入hive表的接口,如下代码所示:

@ResponseBody@PostMapping(value = "/xxx/importTables")public ServiceStatusData localHiveImportTables(    @RequestBody ImportHiveTableDto importTablesDto, @RequestHeader("x-userid") Long userId) {  logger.info("入参记录:importTablesBo={},userId={}", importTablesDto, userId);  if (isBlank(importTablesDto.getHiveDatabaseName())) {    return new ServiceStatusData(ServiceStatusData.Status.Fail, "hive库名不能为空", null);  }  if (isBlank(importTablesDto.getHiveTableName())) {    return new ServiceStatusData(ServiceStatusData.Status.Fail, "hive表名不能为空", null);  }  String tableImportType = importTablesDto.getTableImportType();  if (isBlank(tableImportType)) {    return new ServiceStatusData(ServiceStatusData.Status.Fail, "导表类型不能为空", null);  }  if (null == TableImportTypeEnum.getJsonObjectByCode(tableImportType)) {    return new ServiceStatusData(ServiceStatusData.Status.Fail, "不支持当前的导表类型", null);  }  String decimationFrequency = importTablesDto.getDecimationFrequency();  if (isBlank(decimationFrequency)) {    return new ServiceStatusData(ServiceStatusData.Status.Fail, "抽取频率不能为空", null);  }  if (null == DecimationFrequencyEnum.getJsonObjectByCode(decimationFrequency)) {    return new ServiceStatusData(ServiceStatusData.Status.Fail, "不支持当前的抽取频率", null);  }  importTablesDto.setCron(DecimationFrequencyEnum.toCron(decimationFrequency));  if (null == importTablesDto.getDatasetId()) {    return new ServiceStatusData(ServiceStatusData.Status.Fail, "工作表id不能为空", null);  }  return hiveImportTaskService.localHiveImportTables(importTablesDto, userId);}

启动postman访问该接口,确报出如下错误:

在这里插入图片描述

错误信息比较多,我们就截取如上重要的信息:java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'missionMockId-\x01' for key 'idx_misstion_id_deleted'

2. 分析错误


根据java.sql.SQLIntegrityConstraintViolationException异常信息可知,这是由sql报出的错误,也就是说我的数据表存在异常。

具体是什么异常,我们继续往下分析。

正赶上最近ChatGPT比较火,可以借助它帮助我分析错误,如下图所示:

在这里插入图片描述

ChatGPT说我尝试添加一个与现有记录重复的值,建议我查看重复记录的相关信息。

于是,查看mybatis打印出的SQL语句,如下图所示:

在这里插入图片描述

执行上述mybatis打印出的SQL语句,如下代码所示:

UPDATE hive_import_task SET deleted = 1 ,update_time = NOW() where deleted = 0 and dataset_id = 2ERROR 1062 (23000): Duplicate entry 'missionMockId-\x01' for key 'idx_misstion_id_deleted'

再次分析Duplicate entry 'missionMockId-\x01' for key 'idx_misstion_id_deleted'错误信息,从中可以得到idx_misstion_id_deleted键值。

idx_misstion_id_deleted是我创建的联合唯一索引,关联的字段为mission_iddeleted,不能有重复的记录。

比如只能存在一条mission_id = 'missionMockId' and deleted = 1的记录,但可以存在 mission_id = 'missionMockId' and 'deleted = 0'的记录。

根据update语句中的where条件,使用select查询,如下图所示:

在这里插入图片描述

因而,已经存在一条deleted = 1记录了,当我再把deleted = 0的记录更新为deleted = 1,就已经重复了,才会报出上述的错误。

总结,由于我设置了联合唯一索引(idx_misstion_id_deleted),因而更新数据时会造成两条重复的数据。

3. 解决错误


既然我更新的数据命中了联合唯一索引,导致了该错误,那么,便可进行如下修改。

  1. 使用如下命令删除索引
ALTER TABLE `hive_import_task` DROP INDEX `idx_misstion_id_deleted`;
  1. HiveImportTaskService类的localHiveImportTables方法中做如下代码的限制
public ServiceStatusData localHiveImportTables(ImportHiveTableDto importTablesDto, Long userId) { ...  // 判断是否抽取过  HiveImportTask byDatasetId = hiveImportTaskMapper.queryByDatasetId(datasetId);  if (null != byDatasetId) {    JSONObject body = new JSONObject();    body.put("isTaskExist", true);    return new ServiceStatusData(ServiceStatusData.Status.Fail, "抽取失败:当前任务已存在", body);  }  ...  return new ServiceStatusData(ServiceStatusData.Status.Success, "抽取结束", null);}
  1. HiveImportTaskMapper.java增加queryByDatasetId方法的代码:
HiveImportTask queryByDatasetId(@Param("datasetId") Long datasetId);
  1. hiveImportTaskMapper.xml中添加如下代码:
<select id="queryByDatasetId" parameterType="java.lang.Long"        resultType="com.xxx.HiveImportTask">    <include refid="selectCommon"/>    AND dataset_id = #{datasetId}    ORDER BY    create_time DESC    LIMIT 1</select><sql id="selectCommon">SELECTid AS id,mission_id AS missionId,dataset_id AS datasetId,request_config AS requestConfig,mission_state AS missionState,user_id AS userId,create_time AS createTime,update_time AS updateTime,deleted,import_result AS importResultFROMhive_import_taskWHEREdeleted = 0</sql>

4. 文末总结


通过对java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'missionMockId-\x01' for key 'idx_misstion_id_deleted'错误的分析,得知这是更新数据违反了数据库的唯一约束条件,也就是说违反了唯一索引联合唯一索引

一般报出java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘xxx‘ for key ‘xxx‘这样的错误,其实就是违反了数据库的唯一约束条件!也就是插入数据或添加数据时,具有唯一约束条件的列值重复了。

如果报出这种错误,可有如下两种解决方法:

  1. 取消唯一性约束的列;

  2. 保证插入的数据或更新的数据,与表中已有的数据不重复!

来源地址:https://blog.csdn.net/lvoelife/article/details/129749139

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘xxx‘ for key ‘xxx‘错误的解决方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql报错Duplicate entry ‘xxx‘ for key ‘字段名‘的解决

目录删除主键删除唯一键添加唯一键有时候对表进行操作,例如加唯一键,或者插入数据(已经有唯一键),会报错Duplicate entry...for key...原因是primary key(主键)或unique keyandroid(唯一键
2023-10-19

Error attempting to get column ‘xxx‘ from result set. Cause: java.sql.SQLDataException错误的解决方法

文章目录 1. 复现错误 2. 分析错误 3. 解决错误 4. 文末总结 1. 复现错误 今天写好导入hive表的详情列表的接口,如下代码所示: /** * hive表导入的回调接口 * * @au
2023-08-30

Mysql报错Duplicate entry '值' for key '字段名'的解决方法

今天在使用数据库的过程中,发现一直报Duplicate entry '值' for key '字段名'的错误,所以下面这篇文章主要给大家介绍了关于Mysql报错Duplicate entry '值' for key '字段名'的解决方法,需要的朋友可以参考下
2023-05-16

Mysql报错Duplicate entry '值' for key '字段名'的解决方法

遇到这种问题, 是你的数据库表那个字段设置了唯一索引。所以这个字段新增的数据不能重复。具体可以打开表,然后点击表设置,具体教程可以看下文章最后Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLI
2023-04-14

pip安装python库时报Failed building wheel for xxx错误的解决方法

最近在使用pip安装python的时候遇到些问题,所以下面这篇文章主要给大家介绍了关于pip安装python库时报Failed building wheel for xxx错误的解决方法,需要的朋友可以参考下
2023-01-28

win7开机出现“致命错误C0000034 正在更新操作XXX 共XXX个”的解决方法

win7系统开机出现问题属于常见故障问题之一,这不有位用户说winjavascript7系统开机的时候出现”致命错误C0000034,正在更新操作XXX 共102964个0000000000android000000.cdf-m
2023-05-21

npm出现Cannot find module 'XXX\node_modules\npm\bin\npm-cli.js'错误的解决方法

最近在启动项目的时候会报这个错就是npm丢失,所以下面这篇文章主要给大家介绍了关于npm出现Cannot find module 'XXX\node_modules\npm\bin\npm-cli.js'错误的解决方法,需要的朋友可以参考下
2022-11-13

编程热搜

目录