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的时候还是遇到了一点小麻烦,最后还是解决了,代码如下
后记:
网上说当并发时会查生死锁,不过应该不影响这个功能的实现
学生登陆系统 - 之后会根据模板规则进行试卷的抽取,这些试题均直接从数据库中拿取,然后把抽取完的试题插入到学生试题记录表来存储学生试卷,然后把学生的状态从未登录更新到已抽卷。第一次拿取时因为题库的数据很多,导致界面不能立即拿到数据进行显示,当用户进行刷新时因为整个流程没有走完而进行的又是插入操作就会导致学生记录表中出现两套该学生的试卷
解决思路
主要症结的英文因为从数据库中拿数据比较慢,所以小伙伴再次加了一个预加载将这一门所有的试题在考试前放到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>
后记:
网上说当并发时会查生死锁,不过应该不影响这个功能的实现
相关文章推荐
- mysql insert if not exists防止插入重复记录的方法(转)
- mysql insert if not exists防止插入重复记录的方法
- mysql insert if not exists防止插入重复记录的方法
- mysql insert if not exists防止插入重复记录的方法
- MySQL 当记录不存在时插入(insert if not exists)
- mysql防止重复插入相同记录 insert if not exists
- MS SQL 当记录不存在时插入insert INTO not exists
- mysql insert if not exists防止插入重复记录的方法
- MySQL 当记录不存在时插入insert if not exists
- mysql insert if not exists
- my sql insert if not exists 的方法
- insert if not exists
- C++编程中__if_exists与__if_not_exists语句的用法
- INSERT INTO插入行记录
- INSERT INTO语句中直接插入一条SELECT语句
- SQL插入查询结果 insert into select
- 优化用SQL语句INSERT INTO … SELECT插入数据时锁全表的问题
- MySQL 当记录不存在时插入(insert if not exists)
- insert into 后获得自动插入的id(select @@identity)
- oracle 通过查询灵活插入数据 insert into ...select..