您的位置:首页 > 其它

INSERT INTO IF NOT EXISTS(插入集合)

2018-02-09 21:15 489 查看
背景项目

学生登陆系统 - 之后会根据模板规则进行试卷的抽取,这些试题均直接从数据库中拿取,然后把抽取完的试题插入到学生试题记录表来存储学生试卷,然后把学生的状态从未登录更新到已抽卷。第一次拿取时因为题库的数据很多,导致界面不能立即拿到数据进行显示,当用户进行刷新时因为整个流程没有走完而进行的又是插入操作就会导致学生记录表中出现两套该学生的试卷

解决思路

主要症结的英文因为从数据库中拿数据比较慢,所以小伙伴再次加了一个预加载将这一门所有的试题在考试前放到Redis的,加一个版本字段进行标识,也就是先查后插,尴尬的就是乐观锁只要是用来更新的,如果是插入这个先查的位置放哪呢,并不能解决问题,于是就想在插入的时候有条件的插入就像更新操作时候一样.然后找到了这个语法

INSERT INTO IF NOT EXISTS

demo

http://www.codebit.cn/mysql/insert-if-not-exists.html

这个是参考的一个小demo,网上的demo基本都是单条数据的插入,因为我们是集合的插入,在写sql的时候还是遇到了一点小麻烦,最后还是解决了,代码如下

<insert id="insertAllPaperRecord" parameterType="com.dmsdbj.itoo.examinationEvaluation.entity.PaperRecordEntity">

insert into t_paper_record
(id,
remark,
operator,
is_delete,
correct_answer,
course_id,
standard_score,
mark_status,
mark_user,
paper_id,
question_type_id,
question_main_id,
paper_type_id,
score,
student_answer,
student_id,
examination_id,
create_time,
update_time,
question_order,
semester_id,
teachclass_id,
is_out_of_order,
is_alias,
pid,
student_answer_array_str)
<foreach collection="list" item="item" index="index" separator="union all" >
SELECT
#{item.id,jdbcType=VARCHAR},
#{item.remark,jdbcType=VARCHAR},
#{item.operator,jdbcType=VARCHAR},
0,
#{item.correctAnswer,jdbcType=LONGVARCHAR},
#{item.courseId,jdbcType=VARCHAR},
#{item.standardScore,jdbcType=DOUBLE},
#{item.markStatus,jdbcType=VARCHAR},
#{item.markUser,jdbcType=VARCHAR},
#{item.paperId,jdbcType=VARCHAR},
#{item.questionTypeId,jdbcType=VARCHAR},
#{item.questionMainId,jdbcType=VARCHAR},
#{item.paperTypeId,jdbcType=VARCHAR},
#{item.score,jdbcType=DOUBLE},
#{item.studentAnswer,jdbcType=LONGVARCHAR},
#{item.studentId,jdbcType=VARCHAR},
#{item.examinationId,jdbcType=VARCHAR},
now(),
now(),
#{item.questionOrder,jdbcType=TINYINT},
#{item.semesterId,jdbcType=VARCHAR},
#{item.teachclassId,jdbcType=VARCHAR},
#{item.isOutOfOrder,jdbcType=TINYINT},
#{item.isAlias,jdbcType=TINYINT},
#{item.pid,jdbcType=VARCHAR},
#{item.studentAnswerArrayStr,jdbcType=LONGVARCHAR}
FROM DUAL
WHERE
NOT EXISTS
(SELECT * FROM t_paper_record where paper_id=#{item.paperId} and student_id=#{item.studentId} and is_delete=0)
</foreach>

</insert>


后记:

网上说当并发时会查生死锁,不过应该不影响这个功能的实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: