文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-10 16:15

关注

文章目录


今天写好导入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'


根据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),因而更新数据时会造成两条重复的数据。


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

  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>


通过对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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯