MySQL:错误Duplicate entry ‘33382-1-0‘ for key xxx异常

青旅半醒 2023-06-24 15:30 116阅读 0赞

前言

做项目的时候,执行SQL语句报了Duplicate entry ‘33382-1-0’ for key xxx异常,后来发现是唯一约束导致,于是乎一通谷歌百度,后来解决了,记录一下。

正文

代码片段是这样的:

  1. session.createSQLQuery("insert ignore student_task_trace (student_id,task_plan_id,task_plan_reads_options_id,question_count,finish_count,creation_time,modify_time) " +
  2. "select s.id,:taskPlanId,:planReadsOptionsId,:questionCount,0,NOW(),NOW() from student as s where s.clazz_id in :clazzIdList")
  3. .setParameter("taskPlanId", taskPlanId).setParameter("planReadsOptionsId",tproId)
  4. .setParameter("questionCount", count).setParameterList("clazzIdList", clazzIds).executeUpdate();

可以看到涉及到数据库的表是student_task_trace 。

表的结构式这样的:

在这里插入图片描述
看的出来不仅主键id做了唯一约束,student_id,task_plan_reads_options,sub_type这三个字段做了联合约束,也就是说这三个不能有相同的另一条数据,所以在遇到相同的数据持久化的时候会报异常。

解决方法

1.使用ignore关键字,避免重复插入记录可以使用:

  1. insert ignore student_task_trace (student_id,task_plan_reads_options_id,sub_type)
  2. VALUES (111111,51,0)
  3. insert into student_task_trace (student_id,task_plan_reads_options_id,sub_type)
  4. VALUES (111111,51,0)

第一条sql执行的时候如果已有相同数据会返回0;

第二条sql执行的时候如果已有相同数据会返回异常,如图:

在这里插入图片描述
2.使用Replace,如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,存入新纪录:

  1. REPLACE INTO student_task_trace (student_id,task_plan_reads_options_id,sub_type)
  2. VALUES (111111,51,0)
  3. insert into student_task_trace (student_id,task_plan_reads_options_id,sub_type)
  4. VALUES (111111,51,0)

第一条sql执行的时候如果已有相同数据会返回2,因为删除一条插入一条,主键id会变;

第二条sql执行的时候如果已有相同数据会返回异常;

发表评论

表情:
评论列表 (有 0 条评论,116人围观)

还没有评论,来说两句吧...

相关阅读