批量插入_批量插入数据 - CSDN
精华内容
参与话题
  • SQL批量插入数据

    万次阅读 2019-04-04 21:56:47
    SQL批量插入数据: INSERT INTO orders (Company,OrderNumber) VALUES (‘W3School’,‘2356’),(‘Apple’,‘4698’),(‘W3School’,‘6953’)

    SELECT * FROM Persons p
    – 批量插入
    INSERT INTO Persons VALUES(‘bx9’,‘z’,‘上海’,‘松江’,‘2’)
    ,(‘bx1’,‘z’,‘上海’,‘松江’,‘2’)
    ,(‘bx2’,‘z’,‘上海’,‘松江’,‘2’)
    ,(‘bx3’,‘z’,‘上海’,‘松江’,‘2’)
    ,(‘bx4’,‘z’,‘上海’,‘松江’,‘2’)
    ,(‘bx5’,‘z’,‘上海’,‘松江’,‘2’)
    ,(‘bx6’,‘z’,‘上海’,‘松江’,‘2’)
    ,(‘bx7’,‘z’,‘上海’,‘松江’,‘2’)
    ,(‘bx8’,‘z’,‘上海’,‘松江’,‘2’);
    – 批量修改
      第一种方法:使用insert into 插入,代码如下:

    代码如下

    params=array(value=>50);settimelimit(0);echodate("H:i:s");for(params = array('value'=>'50'); set_time_limit(0); echo date("H:i:s"); for(i=0;i<2000000;i<2000000;i++){
    connectmysql>insert(connect_mysql->insert(params);
    };
    echo date(“H:i:s”);

    最后显示为:23:25:05 01:32:05 也就是花了2个小时多!

    第二种方法:使用事务提交,批量插入数据库(每隔10W条提交下)最后显示消耗的时间为:22:56:13 23:04:00 ,一共8分13秒 ,代码如下:

    代码如下
    echo date(“H:i:s”);

    $connect_mysql->query(‘BEGIN’);
    params=array(value=>50);for(params = array('value'=>'50'); for(i=0;i<2000000;i<2000000;i++){
    connectmysql>insert(connect_mysql->insert(params);
    if($i%100000==0){
    $connect_mysql->query(‘COMMIT’);
    $connect_mysql->query(‘BEGIN’);
    }
    }
    $connect_mysql->query(‘COMMIT’);
    echo date(“H:i:s”);

    第三种方法:使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values (),(),(),()然后再一次性插入,如果字符串太长,

    则需要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet = 210241024*10;消耗时间为:11:24:06 11:25:06;

    插入200W条测试数据仅仅用了1分钟!代码如下:

    代码如下
    sql="insertintotwentymillion(value)values";for(sql= "insert into twenty_million (value) values"; for(i=0;i<2000000;i<2000000;i++){
    $sql.="(‘50’),";
    };
    sql=substr(sql = substr(sql,0,strlen($sql)-1);
    connectmysql>query(connect_mysql->query(sql);

    展开全文
  • 一次性批量插入太好用了

    千次阅读 2018-09-18 17:41:33
    根据某个条件,插入一条数据; 满足这个条件的数据共有5684条,所以新增加的数据也有5684条,按之前的写法,一条条插入,得有个5684条sql insert info 语句,循环执行这个脚本下来,可能还需要用到队列或者放在...

    根据某个条件,插入一条数据;

    满足这个条件的数据共有5684条,所以新增加的数据也有5684条,按之前的写法,一条条插入,得有个5684条sql insert info 语句,循环执行这个脚本下来,可能还需要用到队列或者放在linux环境才能顺利执行,毕竟一般web端执行apache会有一个超时的时间限制,即便去掉了这个超时限制,这个脚本执行起来同样慢的不可描述!

     

    不管如何,还是记录一下曾经用过的一条条执行的老办法吧:

    <?php
    $servername = "127.0.0.1";
    $username = "root";
    $password = "d**********";
    $dbname = "c************";

    // 创建数据库连接
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);

    mysqli_set_charset($conn,"utf8");

    $check_big_id = "select id from table_name  order by id desc limit 1"; //查出最大的记录id
    $big_id_result = $conn->query($check_big_id);
    while($rows  = $big_id_result ->fetch_assoc()) {
        $big_id =  $rows['id'];
    }


    $check_list_id = "select* from table_name where pid=4 "; //limit 1000 单条时候需要limit ,批量插入几千条内亲测不需要limit了。
    $result = $conn->query($check_list_id);

    $list_id_str = '';
    $list_id_arr = array();
    while($row  = $result->fetch_assoc()) {
        $big_id++;

        //单条插入时:
        $list_id = $row['list_id'];

        //批量插入时,把list_id组成数组
        $list_id_arr[] = array(
            "id"=>$big_id,
            "list_id"=>$row['list_id'],
            "pid"=>8
        );

        // *********************以下是单条插入***************************//
        
        //排除已录入的记录
        $check_list_id_now = "select* from table_name where list_id='{$list_id}' and pid=8 limit 1";

        $result_now = $conn->query($check_list_id_now);

        if($result_now->num_rows<1){
            $insert_sql = " insert into table_name(id,list_id,pid) values('{$big_id}','{$list_id}',8)";

             echo "\n";
             echo "----*---";
             echo $insert_sql;
             echo "----*---";
             echo "\n";

             $conn->query($insert_sql);

             //sleep(1);

           //这种单条sql插入数据的办法,就会产生几千条insert into 的sql  
        }

    }

    ?>

    批量插入,等于把sql语句组合成:insert into table_name(field1,field2,field3) values("a1","b1","c1"), ("a2","b2","c2"),("a3","b3","c3")······  //注意sql的长度,某些数据库会有限制;

     

    // *********************以下是批量插入***************************//


    $sql = "INSERT INTO %s( %s ) values %s ";

    $arrValues = array();
    foreach ($list_id_arr as $k => $v) { //list_id_arr 就是要插入的数据
        $arrValues[$k] = "'".implode("','",array_values($v))."'";
    }

    $arr_key = array('id','list_id','pid‘);

    $sql = @sprintf($sql, 'table_name', "{$split}" . implode("{$split} ,{$split}", $arr_key) . "{$split}", "(" . implode(") , (", array_values($arrValues)) . ")");

    //echo $sql;
    echo  date("Y-m-d H:i:s",time());
    echo '---*---';

    $results = $conn->query($sql);

    var_dump($results);

    echo '---**---';

    echo  date("Y-m-d H:i:s",time());

    echo '---*插入数据结束*--’;
    exit();

    打开执行脚本的页面,

    然后···

    还没反应过来就执行完了····

    太棒了!!!

     

    下面是某大神做的一个时间方面的统计,可以做个参考

    2015411105457735.jpg (362Ã152)

    2015411105524293.jpg (529Ã196)

     

    以上就是我本次的分享,如果有不到位的地方,敬请谅解和指出!

    展开全文
  • java实现批量插入

    千次阅读 2019-05-10 14:38:12
    * 批量插入 * * @param tableName * @param datas * @return */ public boolean insertBatch(String tableName, List<Map<String, Object>> datas) { PreparedStatement prepared = null; Connection co...

    /**
    * 批量插入
    *
    * @param tableName
    * @param datas
    * @return
    */
    public boolean insertBatch(String tableName, List<Map<String, Object>> datas) {
    PreparedStatement prepared = null;
    Connection connect = new Mysql().getConnection();
    try {
    connect.setAutoCommit(false); // 设置手动提交
    StringBuffer fieldString = new StringBuffer();
    StringBuffer paraNo = new StringBuffer(); // 预处理字段“?”
    List values = new ArrayList();
    boolean flag = true;
    for (int i = 0; i < datas.size(); i++) {
    for (Object element : datas.get(i).keySet()) {
    if (flag) {
    fieldString.append("," + element);
    paraNo.append(",?");
    }
    values.add(datas.get(i).get(element));
    }
    flag = false;

    			if (prepared == null) {
    				// 所有参数组成的数组
    				String queryString = "INSERT INTO " + tableName + " (" + fieldString.toString().substring(1)
    						+ ") VALUES (" + paraNo.substring(1) + ")";
    				prepared = connect.prepareStatement(queryString);
    			}
    			// 设置对应参数值
    			for (int j = 0; j < datas.get(i).size(); j++) {
    				prepared.setObject(j + 1, values.get(j));
    			}
    			prepared.addBatch();
    			if (i % 10000 == 0) {
    				prepared.executeBatch();
    				connect.commit();
    			}
    			values.clear();
    		}
    		prepared.executeBatch();
    		connect.commit();
    		return true;
    	} catch (Exception e) {
    		e.printStackTrace();
    		throw new RuntimeException(e.getMessage());
    	} finally {
    		try {
    			if (connect != null) {
    				connect.close();
    			}
    			if (prepared != null) {
    				prepared.close();
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;

    /**

    • 单数据库模式 单数据库模式 需要扩展多数据库或使用主从数据库 在此处进行扩展指定连接数据库 同时修改数据库配置

    */
    public class Mysql {
    // 连接数据库的参数
    private static String url = null;
    private static String username = null;
    private static String driver = null;
    private static String passwd = null;

    private static Properties propertie = null;
    private static InputStream configStream = null;
    /**
     * 加载驱动,只需要一次,用静态代码块 单数据库模式,需要扩展多数据库或使用主从数据库在此处进行扩展
     */
    static {
    	try {
    		propertie = new Properties();
    		configStream = Mysql.class.getClassLoader().getResourceAsStream("mysql.properties");
    		propertie.load(configStream);
    
    		url = propertie.getProperty("url");
    		driver = propertie.getProperty("driver");
    		username = propertie.getProperty("username");
    		passwd = propertie.getProperty("password");
    
    		Class.forName(driver);
    	} catch (Exception e) {
    		e.printStackTrace();
    	} finally {
    		try {
    			configStream.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		configStream = null;
    	}
    
    }
    
    /**
     * 获取数据库链接
     * 
     * @return
     */
    public Connection getConnection() {
    	Connection con = null;
    	try {
    		con = DriverManager.getConnection(url, username, passwd);
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    
    	return con;
    }
    

    }

    //调用方法

    List<Map<String, Object>> datas = new ArrayList<>();
    Map<String,Object> user = new HashMap<>();
    user.put(字段,对应值);
    datas.add(user);
    insertBatch(表名, datas);

    展开全文
  • 以前总是说批量插入和更新的效率比非批量的要高,但是到底高多少,没有评估过,今天我就具体的测试下(1)三种插入操作的方法1.1 利用for循环的批量插入示例xml &lt;insert id="insertUser"&gt; ...
    以前总是说批量插入和更新的效率比非批量的要高,但是到底高多少,没有评估过,今天我就具体的测试下

    (1)三种插入操作的方法

    1.1 利用for循环的批量插入

    示例xml

        <insert id="insertUser">
            insert into test_user (u_name,create_date) value (#{userName},SYSDATE())
        </insert>

    示例代码:

    for (int i = 1; i <= num; i++) {
        User user = new User();
        user.setUserName("a" + i);
        user.setCreateDate(new Date());
        userDao.insertUser(user);
    }

    2. 采用jdbc

    示例代码:

            Connection conn;
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://192.168.0.200:3306/xxx", "root", "root");
                conn.setAutoCommit(false);
                String sql = "insert into test_user (u_name,create_date) value (?,SYSDATE())";
                PreparedStatement prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
                        ResultSet.CONCUR_READ_ONLY);
                conn.setAutoCommit(false);
    
                for (int i = 1; i <= 100; i++) {
                    prest.setString(1, "a" + i);
                    prest.addBatch();
                }
                prest.executeBatch();
                conn.commit();
    
    
                conn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }

    数据量分别是10,100,300,1000,5000条数据


    数据量:10
    批量更新耗时:279
    非批量更新耗时:1522
    jdbc批量更新耗时:255

    数据量:100
    批量更新耗时:720
    非批量更新耗时:3391
    jdbc批量更新耗时:1912

    数据量:300
    批量更新耗时:987
    非批量更新耗时:9827
    jdbc批量更新耗时:7616

    数据量:500
    批量更新耗时:1649
    非批量更新耗时:16253
    jdbc批量更新耗时:10475

    数据量:1000
    批量更新耗时:2552
    非批量更新耗时:33048
    jdbc批量更新耗时:20793

    数据量:5000
    批量更新耗时:19066
    非批量更新耗时:239127
    jdbc批量更新耗时:103273


    这里写图片描述

    综上分析,效率排比如下
    mybatis批量更新 > jdbc批量更新 > 循环调用update语句


    (2)三种批量更新的方法

    2.1 利用for循环批量更新

    示例xml

        <update id="updateUser">
            update test_user set test_user.u_name = (#{updateUserName}) where test_user.u_name = (#{userName})
        </update>
    • 1
    • 2
    • 3

    示例代码

            for (int i = 1; i <= num; i++) {
                User user = new User();
                user.setUserName("a" + i);
                user.setUpdateUserName("b" + i);
                userDao.updateUser(user);
            }

    2.2 jdbc 批量更新

    示例代码

    Connection conn;
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://192.168.0.200:3306/xxx", "root", "root");
                conn.setAutoCommit(false);
    
                // 保存当前自动提交模式
                boolean autoCommit = conn.getAutoCommit();
                // 关闭自动提交
                conn.setAutoCommit(false);
                 Statement stmt =conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 
    
                for (int i = 1; i <= num; i++) {
                    stmt.addBatch("update test_user set test_user.u_name = ('d"+i+"') where test_user.u_name = ('c"+i+"')"); 
                }
    
                stmt.executeBatch();   
                conn.commit(); 
                conn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }

    2.3 mybatis 批量更新

    其实是利用了mysql的批量更新的语法
    case when的语法
    详见 【case when 语法
    示例xml

        <update id="batchUpdateList">
            update test_user
            <trim prefix="set" suffixOverrides=",">
    
                <trim prefix="u_name =case" suffix="end,">
                    <foreach item="item" collection="userList">
                        when test_user.u_name = (#{item.userName})
                        then #{item.updateUserName}
                    </foreach>
                </trim>
    
            </trim>
            where
            <foreach item="item" collection="userList" separator="or">
                (test_user.u_name = (#{item.userName}))
            </foreach>
    
        </update>

    示例代码

            for (int i = 1; i <= num; i++) {
                User user = new User();
                user.setUserName("a" + i);
                user.setUpdateUserName("b" + i);
                userList.add(user);
            }
            userDao.batchUpdateList(userList);

    数据量分别是10,100,300,1000,5000条数据


    数据量:10
    批量更新耗时:279
    非批量更新耗时:1522
    jdbc批量更新耗时:255

    数据量:100
    批量更新耗时:720
    非批量更新耗时:3391
    jdbc批量更新耗时:1912

    数据量:300
    批量更新耗时:987
    非批量更新耗时:9827
    jdbc批量更新耗时:7616

    数据量:500
    批量更新耗时:1649
    非批量更新耗时:16253
    jdbc批量更新耗时:10475

    数据量:1000
    批量更新耗时:2552
    非批量更新耗时:33048
    jdbc批量更新耗时:20793

    数据量:5000
    批量更新耗时:19066
    非批量更新耗时:239127
    jdbc批量更新耗时:103273


    这里写图片描述

    综上分析,效率排比如下
    mybatis批量更新 > jdbc批量更新 > 循环调用update语句



    展开全文
  • mysql批量插入

    千次阅读 2018-05-09 09:46:19
    mysql批量插入 2016年10月27日 09:56:18 阅读数:5476 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或...
  • 批量插入

    万次阅读 2019-12-16 01:35:23
    注意: mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。将?rewriteBatchedStatements=true写在配置文件的url后面 使用更新的mysql 驱动:mysql-connector-java-5.1.37-bin.jar ...
  • 简单批量插入的实现

    2018-07-08 23:12:09
    -- 配置一个可以执行批量的sqlSession --&gt; &lt;bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"&gt; &lt;constructor-arg name="...
  • 批量插入实现

    2019-02-27 16:11:10
    一:使用map封装,这种方法使用于前端传值过来,然后封装批量插入 1:先创建对象 Map&lt;String,Object&gt; map = new HashMap&lt;&gt;(); Map&lt;String, Object&gt; params = new ...
  • mysql使用函数批量插入数据

    万次阅读 2019-05-05 09:11:23
    不管是在做并发测试还是大数据的压力测试时,我们都需要造很多的用户或者记录数据,经常就需要用到往数据库批量插入数据,以满足测试需求。 以下实例使用的是mysql数据库,客户端为Navicat 1.选择需要操作的数据库...
  • laravel 实现批量插入数据

    万次阅读 2018-11-16 14:53:05
    在写项目的时候,写关于订单的店铺备注以及后续一系列操作的时候,foreach的循环orm create()让我比较蛋疼, 于是找了找文档,找到了方法实现批量插入,
  • mybatis批量插入并返回主键(xml和注解两种方式)

    万次阅读 多人点赞 2019-07-31 19:36:47
    mybatis批量插入 在mysql数据库中支持批量插入,所以只要配置useGeneratedKeys和keyProperty就可以批量插入并返回主键了。 比如有个表camera,里面有cameraNo,chanIndex,cameraName这三个字段,其中cameraNo是自增...
  • mongodb批量插入插入数据

    万次阅读 2014-08-21 15:17:28
    @Test public void test200() throws Exception{ MongoControl mongo = new MongoControl("smg", "t_schedule"); List list = new ArrayList(); for(int i = 10000001; i ; i++) { DBObject
  • sql中的单条出入与批量插入效率比较
  • Oracle的批量插入,两种写法

    万次阅读 2019-03-23 10:25:11
    <insert id="insertBatchDeliverableSubmit" parameterType="cn.evun.qns.sqm.apqp.model.PPAP"> insert into SQM_PPAP_DELIVERABLE_SUBMIT (ID, PPAPCODE, DELIVERABLEID, ...
  • Packet for query is too large (6071393 > 4194304). You can change this value on the server by setting the max_allowed_...批量插入数据量过大,解决办法 修改 my.ini 加上 max_allowed_packet =67108864
  • 在mongoDB中,当我们要插入很多数据时,可以选择用循环依次逐条插入,或者可以先把所有数据装在一个数组再整个数组插入集合,但是,最好使用第二种方式,如下代码所示(已新建数据库log和集合test),在js写入如下...
  • python向mySQL批量插入数据的方法

    万次阅读 2012-02-07 14:32:24
    通过调用mySQLdb python库中的 cursor.executemany()函数...今天用这个函数完成了批量插入 例程: def test_insertDB():  conn = database.Connection(host=options.mysql_host, database=options.mysql_database,
  • Oracle批量插入数据的三种方式

    万次阅读 2018-06-12 16:41:01
    第一种: begin insert into tableName(column1, column2, column3...) values(value1,value2,value3...); insert into tableName(column1, column2, column3...) values(value1,value2,value3...);...
  • 批量插入时又有可能遇到主键 或者 唯一索引重复的问题,导致整个批量插入失败 使用 ON DUPLICATE KEY UPDATE 一条sql解决批量插入和主键或者唯一索引重复问题 举例如下: 表结构如下: create table mytable
  • MyBatis-Plus 批量插入

    万次阅读 2019-08-09 18:51:35
    spring boot+mybatis plus环境,单条插入用的是BaseMapper自带的insert方法 public ApiResult addAnc(Anc anc) { ApiResult result = new ApiResult(); Integer insert = ancMapper.insert(anc); if...
1 2 3 4 5 ... 20
收藏数 137,973
精华内容 55,189
关键字:

批量插入