精华内容
下载资源
问答
  • 使用场景:  批量导入一大堆的excel...mysql 批量插入,批量插入跳过主键重复,简化批量插入 package com.chenfan.finance.utils; import cn.hutool.core.util.ReflectUtil; import com.chenfan.finance.producer...

    使用场景:

      批量导入一大堆的excel文件,插入数据时候有点慢,所以要批量插入。插入中跳过主键重复报错

    mysql 批量插入,批量插入跳过主键重复,简化批量插入

    package com.chenfan.finance.utils;
    
    import cn.hutool.core.util.ReflectUtil;
    import com.chenfan.finance.producer.U8Produce;
    
    import java.util.List;
    import java.util.concurrent.ForkJoinPool;
    import java.util.concurrent.ForkJoinTask;
    import java.util.concurrent.RecursiveTask;
    
    /**
     * @author liran
     */
    public class BatchInsertUtil {
    
        public static int batchInsert(List<?> tables, Class<?> mapperClass, String methodName) {
            int insert = 5000;
            if (tables.size() < insert) {
                insert = tables.size();
            }
            int loop = tables.size() / insert;
            Object mapper = U8Produce.applicationContext.getBean(mapperClass);
            int result = 0;
            for (int i = 0; i < loop; i++) {
                int start = i * insert;
                int end = (i + 1) * insert;
                if (loop - 1 == i) {
                    end = tables.size();
                }
                Object invoke = ReflectUtil.invoke(mapper, methodName, tables.subList(start, end));
                int sum = Integer.parseInt(String.valueOf(invoke));
                result = sum + result;
            }
            return result;
        }
    
        public static int batchInsertTask(List<?> tables, Class<?> mapperClass, String methodName) {
            ForkJoinPool fjp = new ForkJoinPool(8);
            Object mapper = U8Produce.applicationContext.getBean(mapperClass);
            ForkJoinTask<Integer> task = new SaveTask(tables, 0, tables.size(), mapper, methodName);
            return fjp.invoke(task);
        }
    
        public static class SaveTask extends RecursiveTask<Integer> {
            static final int THRESHOLD = 5000;
            List<?> array;
            int start;
            int end;
            Object mapper;
            String method;
    
            SaveTask(List<?> array, int start, int end, Object mapper, String method) {
                this.array = array;
                this.start = start;
                this.end = end;
                this.mapper = mapper;
                this.method = method;
            }
    
            @Override
            protected Integer compute() {
                if (end - start <= THRESHOLD) {
                    Object invoke = ReflectUtil.invoke(mapper, method, array.subList(start, end));
                    return Integer.parseInt(String.valueOf(invoke));
                }
                int middle = (end + start) / 2;
                System.out.println(String.format("split %d~%d ==> %d~%d, %d~%d", start, end, start, middle, middle, end));
                SaveTask task1 = new SaveTask(this.array, start, middle, mapper, method);
                SaveTask task2 = new SaveTask(this.array, middle, end, mapper, method);
                invokeAll(task1, task2);
                int subresult1 = task1.join();
                int subresult2 = task2.join();
                int result = subresult1 + subresult2;
                System.out.println("result = " + subresult1 + " + " + subresult2 + " ==> " + result);
                return result;
            }
        }
    
    
    }
    
    

    说明:SaveTask 是用了fork join 这里一般要根据cpu 核数来确定   “ForkJoinPool fjp = new ForkJoinPool(8)”

    aplication 就是普通的spring bean注入

     mapper

    插入时候如果要跳过主键重复或者唯一索引的校验, insert ignore

      <insert id="insertList">
            insert ignore into reference_table (
            id, tid, task_year_month, table_type
            )
            VALUES
            <foreach collection="subList" item="item" separator=",">
                (#{item.id,jdbcType=VARCHAR},
                #{item.tid,jdbcType=VARCHAR},
                #{item.taskYearMonth,jdbcType=TIMESTAMP},
                #{item.tableType,jdbcType=TINYINT})
            </foreach>
        </insert>
    
    

    直接调用

    BatchInsertUtil.batchInsert(tables, ReferenceTableMapper.class, "insertList");



    展开全文
  • <!-- 批量插入数据 --> <insert id="insertxxxByBatch" parameterType="java.util.List"> insert ignore into xxxtable ( xxx_id, yyy_id, version ) values <for...
    <!-- 批量插入数据 -->
    <insert id="insertxxxByBatch" parameterType="java.util.List">
        insert ignore into xxxtable (
            xxx_id,
            yyy_id,
            version
        )
        values
        <foreach collection="list" item="item" index="index"
                 separator=",">
            (
            #{item.xxxId},#{item.yyyId},#{item.version}
            )
        </foreach>
    </insert>
    

    此表中,xxx_id为唯一索引,批量插入数据时,使用ignore关键字,监测唯一索引,自动跳过重复数据,插入未重复数据。

    不使用ignore关键字时,则会抛出违反唯一索引异常。

    另:执行批量执行操作时,数据库连接地址上需要加&allowMultiQueries=true,表示可以支持批量操作

    IGNORE会导致自增ID不连续,这个应该与IGNORE的机制有关,因为重复的那条插入SQL是执行了的,只是没有入库。

    例:jdbc:mysql://ip:port/dataresource?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true

    ignore的详细解释:https://blog.csdn.net/loongshawn/article/details/52387986

    展开全文
  • eg insert ignore into friends (requestor, buddy) values (value1, value2), (value2, value1), (value3, value4), (value4, value3), ... what happens if i have duplicate? will it a) not insert everything?...

    I have a bunch of data that i want to insert and i have decided to use bulk insert for mysql.

    insert into friends (requestor, buddy) values (value1, value2), (value2, value1), (value3, value4), (value4, value3), ...

    i would like to know the following:

    1) can i use ignore? eg

    insert ignore into friends (requestor, buddy) values (value1, value2), (value2, value1), (value3, value4), (value4, value3), ...

    what happens if i have duplicate? will it a) not insert everything? b) insert the records before the duplicate record and STOP processing the data after that? c) ignore the duplicate and carry on with the rest?

    2) is there a limit to the no. of records i can use for a bulk insert like this?

    Thank you.

    解决方案

    Yes, you can use the "ignore" keyword, and it will simply ignore duplicate errors. It will insert every row that it can, skipping those that would lead to duplicates (and it will not stop processing data.) If you do something like this (where we assume that the first column is a primary key):

    insert ignore into c values (1,1), (2,2), (3,3), (3,5), (4,5);

    Then that means that (3,3) will be inserted and (3,5) will not. Everything but (3,5) will be inserted (assuming a fresh table.)

    There is probably no hard limit, but you might want to do testing to see where you should draw the line based on your needs.

    Edit: It does seem that MySQL has a configurable limit on the size of SQL queries, with the default being 1MB. More info: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_query_cache_limit.

    展开全文
  • <!-- 批量插入数据 --> <insert id="insertxxxByBatch" parameterType="java.util.List"> insert ignore into xxxtable ( xxx_id, yyy_id, version ...
    <!-- 批量插入数据 -->
        <insert id="insertxxxByBatch" parameterType="java.util.List">
            insert ignore into xxxtable (
                xxx_id,
                yyy_id,
                version
            )
            values
            <foreach collection="list" item="item" index="index"
                     separator=",">
                (
                #{item.xxxId},#{item.yyyId},#{item.version}
                )
            </foreach>
        </insert>

    此表中,xxx_id为唯一索引,批量插入数据时,使用ignore关键字,监测唯一索引,自动跳过重复数据,插入未重复数据。

    不使用ignore关键字时,则会抛出违反唯一索引异常。

    另:执行批量执行操作时,数据库连接地址上需要加&allowMultiQueries=true,表示可以支持批量操作

    例:jdbc:mysql://ip:port/dataresource?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true

    转载于:https://www.cnblogs.com/huahuavip/p/9394627.html

    展开全文
  • MySQL批量插入与更新

    万次阅读 多人点赞 2019-05-20 16:07:36
    结果: 1 20 a 2 26 b 3 30 c 4 22 d 注:insert into values 或 insert into select批量插入时,都满足事务的原子性与一致性,一条出错整体都会回滚。在使用insert into select时,MySQL会对select的数据加S(读)...
  • Mybatis 3.4.4批量插入时当使用IGNORE重复忽略时,返回的id错乱 比如 数据库原有3条数据 pid时唯一键,id为主键 id--pid--name 1--01--test 2--02--test 3--03--test 然后插入3条数据 02--test 04--test 05--test ...
  • SQL Server 批量插入数据方案 SqlBulkCopy 相较于 Insert 语句而言有20~40倍性能提升,下面我们将 SqlBulkCopy 进行简单封装,让批量插入更方便
  • I have the responsibility of switching our code from sqlite to postgres. One of the queries I am having trouble with is copied below.INSERT INTO group_phones(group_id, phone_name)SELECT g.id, p.name.....
  •  在使用MyBatis框架的时候,如果项目使用的是Oracle数据库,在进行批量插入的时候你还在使用List循环执行insert语句实现的话;用现在流行的一句话说:那你真是Out啦····。好了吐槽结束,现在步入正题“解决使用...
  • Atitit mysql insert perf enhance 批量插入数据库性能 目录 1.1. 案一:使用ignore关键字 1 2. 异步插入 2 2.1. 其它关键:DELAYED 做为快速插入,并不是很关心失效性,提高插入性能。IGNORE 只关注主键对应...
  • mybatis批量插入

    2017-08-01 16:10:01
    mybatis批量插入的方法,已经遇到的坑及填坑。
  • 在进行大数据量插入时,使用execute效率很低。 所以改用executemany executemany(query,args)  能同时执行多条语句,执行同样多的语句可比execute()快很多,强烈建议执行多条语句时使用executemany  query: ...
  • 批量执行插入操作的时候,一般使用Mabatis自带的foreach遍历集合从而插入数据 1、第一种方式 insert into t_jd_kvop_msg(msg_id, msg_type, msg_time,msg_result,is_handle,is_ignore) values <foreach ...
  • mysql在批量插入数据的时候,如果有一个字段具有unique约束,而插入数据重复的话,就会抛出DuplicateKeyException 导致后续批量数据无法插入,这是可以在sql中使用ignore来让mysql不抛出异常: insert ignore ...
  • 今天我们来了解MySQL唯一索引的一些知识:包括如何创建,如何批量插入,还有一些技巧上SQL; 这些问题的根源在什么地方?有什么共同点?MySQL中也有分区对齐的概念?唯一索引是在很多系统中都会出现的要求,有什么...
  • mysql 批量插入

    2014-10-01 11:59:00
    对于批量插入:  1、在建立唯一索引的情况下,,从前往后,如果遇到索引重复错误 则停止插入(前面的插入成功),错误后面的即使正确也不会插入  方法1:insert igore 后 解决此问题 (ignore是指如果索引重复则...
  • 由于想批量插入提升效率,最近做了下ibatis的批量插入,结果一直报错 :StringIndexOutOfBoundsException ,原来是value中的格式不正确。
  • myBatis批量插入

    2019-04-28 14:06:19
    1.定义集合     DAO接口:void insert(List list);...INSERT IGNORE,是id相同时忽略插入此条数据 INSERT IGNORE d_user_course ( id, user_id, name ) VALUES <foreach collection="li...
  • 注意:merge into 在批量插入的时候,假如第一批插入的是一个空表,由于a1.code一开始为null,是无法实现去重的。 解决方法:先往表里面插入一条数据,是表存在数据之后,然后再进行批量插入 这种现象只出现在11g 在...
  • 我们在做批量插入的时候,经常需要根据唯一字段判断,唯一字段相同时则进行更新,唯一字段不同时则进行插入。一般来说我们都是采用on duplicate key update 写法,只是假如我们需要、在唯一字段相同,并且满足其他...
  • 知识这个东西,看来真的要温故而知新,一直不用,都要忘记了????...业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入那么问题来了,是不是每次插...
  • Mybatis批量插入数据

    2021-02-05 11:03:51
    使用mybatis实现批量插入文件路径和时间等 1.基础数据库插入语句: insert into table ([列名],[列名]) values ([列值],[列值])); 或: insert into table values ([列值],[列值])); mybatis中mapper.xml的写法: &...
  • 本文实例讲述了ThinkPHP3.2框架使用addAll()批量插入数据的方法。分享给大家供大家参考,具体如下: thinkphp中model类的addAll()方法可以将数据同时添加到数据库中. // 批量添加数据 (only MySQL) $user = M('user...
  • mysql批量插入重复不报错

    千次阅读 2019-02-11 18:57:56
    主键已存在,不更改原纪录,只插入新的记录 INSERT IGNORE INTO 方案二:replace 主键已存在,则替换原记录,即先删除原记录,后insert新记录 REPLACE INTO 方案三:on duplicate key update 主键已存在,则执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,218
精华内容 3,287
关键字:

ignore批量插入