批量插入數據到 MySQL的幾種方式


一.JDBC批量操作+事務提交

package com.sb.test;

import java.sql.*;
import java.util.Random;

/**
 * 批量操作+事務提交
 **/
public class JdbcInsertDataLess {
    private static String url = "jdbc:mysql://localhost:3306/TEST?characterEncoding=utf8&serverTimezone=GMT%2B8";
    private static String user = "root";
    private static String password = "root";

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstm = null;
        ResultSet rt = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, password);
            String sql = "INSERT INTO person(pid,name) VALUES(?,CONCAT('姓名',?))";
            pstm = conn.prepareStatement(sql);
            conn.setAutoCommit(false);
            Long startTime = System.currentTimeMillis();
            Random rand = new Random();
            int a, b;
            //插入100000條數據
            for (int i = 1; i <= 100000; i++) {
                pstm.setInt(1, i);
                pstm.setInt(2, i);
                //隨機數
                a = rand.nextInt(10);
                b = rand.nextInt(10);
                pstm.setString(1, "188" + a + "88" + b);
                pstm.addBatch();
            }
            pstm.executeBatch();
            conn.commit();
            Long endTime = System.currentTimeMillis();
            System.out.println("************************正在插入中,請稍等******************************");
            System.out.println("批量插入用時:" + (endTime - startTime));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            if (pstm != null) {
                try {
                    pstm.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

二.存儲過程批量插入

DROP PROCEDURE IF EXISTS proc_initData;-- 如果存在此存儲過程則刪掉
DELIMITER $
CREATE PROCEDURE proc_initData()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i<=100000 DO
        INSERT INTO person VALUES(i,CONCAT('姓名',i));
        SET i = i+1;
    END WHILE;
END $
CALL proc_initData();

三.使用UNION ALL來進行插入操作

INSERT INTO person(pid,NAME)
 SELECT 4,'000'
 UNION ALL
 SELECT 5,'001'
 UNION ALL
 SELECT 6,'002'
 
 
 
1INSERT INTO person(pid, name)
 VALUES(11, val12), 
 (21, val22),
 (31,val32) ;
 
 
2INSERT INTO person(pid, name) SELECT 333, val12 UNION ALL SELECT 33333, val22 union all select 444, val32 ;
這樣的寫法是屬於復合SQL語句,表示先把兩個SELECT的結果集進行無刪減的聯合,再把聯合結果插入到TABLE中。

四.腳本插入數據

 

 

 

 insert.sql

INSERT INTO person(pid, name)
 SELECT 777,'val12'
 UNION ALL
 SELECT 88888888,'val22' 
union all
 select 88888, 'val32' ;    

insertbatch.bat

#!/bin/bash
p="/tmp" //目錄下全是sql文件
dbUser='root'
dbPassword='root'
dbName='hengda'
cd $p;
for f in `ls $p/*.sql`
do
echo $f;
mysql -u $dbUser -p$dbPassword -f $dbName -e "source $f";
mv $f $f.done;
done
echo 'finished!'

reradme.md

/tmp" ://目錄下全是sql文件

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM