速度比 INSERT 快 20 倍以上,適用於百萬級以上資料匯入場景。
LOAD DATA INFILE 'E://baidu//cp9.csv' REPLACE INTO TABLE baidu_34000_0_competition CHARACTER SET utf8 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;
| 子句 | 說明 |
|---|---|
REPLACE / IGNORE | 主鍵/唯一鍵衝突處理:REPLACE 覆蓋,IGNORE 跳過 |
CHARACTER SET | 指定檔案編碼 (utf8/gbk/latin1 等) |
FIELDS TERMINATED BY | 欄位分隔符 (預設 \t) |
ENCLOSED BY | 欄位包裹字元 (如 CSV 雙引號) |
LINES TERMINATED BY | 行結束符 (\n / \r\n) |
IGNORE 1 LINES | 跳過標題行 |
LOCAL | 客戶端讀取檔案傳送給 Server (需啟用 local_infile) |
package com.mysql.csv;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Competition {
static Connection conn = null;
static String driver = "com.mysql.jdbc.Driver";
static String url = "jdbc:mysql://127.0.0.1:3306/nerd_1";
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName(driver);
conn = DriverManager.getConnection(url, "root", "1234");
String sql = "LOAD DATA INFILE 'E://baidu//cp9.csv' " +
"REPLACE INTO TABLE baidu_34000_0_competition " +
"CHARACTER SET utf8 " +
"FIELDS TERMINATED BY ',' " +
"ENCLOSED BY '\"' " +
"LINES TERMINATED BY '\r\n' " +
"IGNORE 1 LINES";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.execute();
conn.close();
}
}
SHOW VARIABLES LIKE 'secure_file_priv'; -- 結果為 NULL 表示禁用,需配置 my.cnf: secure_file_priv = '' 並重啟
LOCAL 關鍵字由 Client 讀取檔案,需 JDBC 連線參數 allowLoadLocalInfile=truemax_allowed_packet:大檔案需調大此參數