ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle 实现批量插入并且获取批量插入的主键id

2020-03-12 16:42:37  阅读:194  来源: 互联网

标签:task obj 批量 获取 插入 主键


Oracle 批量插入使得主键自增有很多实现方式,笔者使用的是较为简单的(序列)的方式,实现批量插入。但是有个问题,就是批量插入的同时获取每条插入数据的序列号。因为Oracle本身不像Mysql,是不支持批量返回主键id的,这也就是说,Mysql结合Mybatis的自动赋值主键的注解是无效的。当然,获取主键主要两种。 

方式一: 先拿到主键,再批量插入。

方式二: 批量插入,再拿到主键。

笔者,所使用的是方式一,因为方式二我考虑使用触发器拿取,但是经过同事大佬点拨,大致意思是触发器很影响查询效率,相当于上锁,所以在这种情况下,实际业务不建议使用。方式一,我考虑就是先获取序列,放入到插入的集合中,再批量插入。但是这样有一个问题,就是需要频繁的与数据库交互,所以,如果大家有什么好的建议,可以提出来。

获取序列:

   /** 获取序列
     * @return
     */
    Long getTaskSeq();
  <select id="getTaskSeq" resultType="java.lang.Long">
         SELECT TASK_ID_SEQ.NEXTVAL FROM dual
  </select>

插入集合:

saveList.forEach(saveTaskDto -> {
                Long taskSeq = userTaskDao.getTaskSeq();
                saveTaskDto.setTaskId(taskSeq);
            });

批量插入:

  <insert id="insertBatchs" useGeneratedKeys="false" keyProperty="taskId">
        BEGIN
        <foreach collection="saveList" item="obj" separator="">
            insert into
            enterprise_user_task(task_id,enterprise_user_id,task_type,task_date,task_date_type,sys_create_date,sys_create_user)
            values
            (#{obj.taskId},#{obj.resourceUserId}, #{obj.taskType}, to_date(#{obj.taskDate}, 'yyyy-MM-dd'),#{obj.taskDateType}, #{obj.createDate},
            #{obj.createUser});
        </foreach>
        COMMIT;
        END;
    </insert>

这样就可以在插入的同时,获取到批量插入的数据的序列。

标签:task,obj,批量,获取,插入,主键
来源: https://blog.csdn.net/ls490447406/article/details/104821588

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有