施行SQL命令的时候unique约束字段较为Duplicateentry33382-1-0forkeyxxx转载

原创
小哥 2年前 (2022-12-30) 阅读数 59 #大杂烩

在做项目时,实施它。SQL语句报了Duplicate entry 33382-1-0 for key xxx后来发现异常是由唯一的限制造成的,因此谷歌股份有限公司(GoogleBaidu,Inc.)后来得到了解决和记录。

正文:

代码段如下所示:

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如果在执行期间已经存在相同的数据,则将返回该数据。异常;

还有其他解决方案在这里没有解释。如果有必要,谷歌可以自己做。-------“解决数据库唯一约束插入相同数据问题”。


作者:zhuzhihongNO1
来源:CSDN
原文:https://blog.csdn.net/tomcat\_zhu/article/details/82911158
版权声明:本文为博主原创文章,转载请附上博客链接!

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门