標準範本
LOAD DATA INFILE 'D:\\test\\haha.csv'
REPLACE INTO TABLE `myTable`
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\r\n';
參數解析
| 子句 | 說明 | 常見值 |
| REPLACE / IGNORE | 主鍵/唯一鍵衝突時:REPLACE 覆蓋、IGNORE 跳過 | 視業務而定 |
| FIELDS TERMINATED BY | 欄位分隔符 | ',' (CSV)、'\t' (TSV)、'|' |
| OPTIONALLY ENCLOSED BY | 欄位包裹字元(僅包裹含分隔符/換行的欄位) | '"'"、'\'' |
| ESCAPED BY | 轉義字元 | '\\' (預設)、'' (禁用) |
| LINES TERMINATED BY | 行結束符 | '\r\n' (Windows)、'\n' (Linux/Mac) |
| IGNORE n LINES | 跳過前 n 行(如標題行) | IGNORE 1 LINES |
| (col1, col2, ...) | 指定目標欄位順序/子集 | CSV 欄序與表不同時必填 |
進階用法
-- 僅導入指定欄位,並轉換日期格式
LOAD DATA INFILE '/data/order.csv'
INTO TABLE orders
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(order_no, @raw_date, amount, status)
SET order_date = STR_TO_DATE(@raw_date, '%Y-%m-%d %H:%i:%s');
-- 從標準輸入導入 (管道/腳本)
cat data.csv | mysql -uroot -p -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE t ..."
權限與安全
- 需
FILE 權限(極高危,僅授信任帳號)。
LOCAL 關鍵字:檔案在客戶端,經網路傳輸至伺服器,需客戶端與伺服器均啟用 local_infile=1。
- 安全路徑限制:
secure_file_priv 目錄外檔案無法讀寫(MySQL 5.6+ 預設啟用)。
效能貼士
- 導入前
SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;,導入後恢復並 COMMIT。
- 大檔案分批(如 10 萬行/批)避免長事務鎖定。
- 目標表無索引時最快;有索引則按塊寫入、合併排序。