执行SQL语句的时候唯一约束字段异常Duplicate entry '33382-1-0' for key xxx

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

正文:

代码片段是这样的:

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) " +
							"select s.id,:taskPlanId,:planReadsOptionsId,:questionCount,0,NOW(),NOW() from student as s where s.clazz_id in :clazzIdList")
					.setParameter("taskPlanId", taskPlanId).setParameter("planReadsOptionsId",tproId)
					.setParameter("questionCount", count).setParameterList("clazzIdList", clazzIds).executeUpdate();

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

表的结构式这样的:

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

解决方法:

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

insert ignore student_task_trace (student_id,task_plan_reads_options_id,sub_type)
VALUES (111111,51,0)

insert into student_task_trace (student_id,task_plan_reads_options_id,sub_type)
VALUES (111111,51,0)

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

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

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

REPLACE INTO student_task_trace (student_id,task_plan_reads_options_id,sub_type)
VALUES (111111,51,0)

insert into student_task_trace (student_id,task_plan_reads_options_id,sub_type)
VALUES (111111,51,0)

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

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

还有其他的解决方案这里不做说明,如需要可自行谷歌-------“解决数据库唯一约束插入相同数据问题”。

  • 24
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值