批次處理是一種非互動式執行 MySQL 程式的方式。簡單來說,您將原本在 MySQL 命令列中手動輸入的 SQL 指令,預先寫入一個文字檔案中,再透過重導向方式一次性送入 MySQL 執行。這對於大量資料匯入、自動化腳本或從舊系統遷移資料時特別實用。
首先準備一個純文字檔(例如 New_Data.sql),檔案內容即為您要執行的 SQL 指令,每行結尾務必以分號 ; 結束。範例如下:
USE Meet_A_Geek;
INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Block");
INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Newton");
INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Simmons");
注意: 所有語法必須正確,USE 選擇資料庫,INSERT 插入資料。
確認 MySQL 服務(Windows 稱為服務,Linux 稱為進程)已啟動,然後在命令列執行:
bin/mysql –p < /home/mark/New_Data.sql
輸入密碼後,若 SQL 無誤,資料即會匯入資料庫。
若您已有現成的資料檔(如 CSV、TSV),使用 LOAD DATA INFILE 會比手寫 INSERT 效率高得多。此指令可在 MySQL 命令列或應用程式(透過 API)中直接呼叫。
USE Meet_A_Geek;
LOAD DATA INFILE "/home/mark/data.sql" INTO TABLE Orders;
LOAD DATA LOCAL INFILE "C:\MyDocs\SQL.txt" INTO TABLE Orders;
LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE Orders;
REPLACE 以新資料取代舊資料;IGNORE 則保留舊資料、略過新資料。
LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE Orders;
若資料檔非預設的 Tab 分隔,可自訂分隔符、引用字元、跳脫字元:
LOAD DATA INFILE "/home/mark/Orders.txt" REPLACE INTO TABLE Orders
FIELDS TERMINATED BY ',' ENCLOSED BY '"';
TERMINATED BY:欄位分隔符,預設 \tENCLOSED BY:欄位包裹字元,如雙引號ESCAPED BY:跳脫字元,預設反斜線 \當來源檔案欄位與目標資料表不完全對應時(如從 Access 遷移至 MySQL,新增了額外欄位),可明確指定對應欄位:
LOAD DATA INFILE "/home/Order.txt" INTO TABLE Orders
(Order_Number, Order_Date, Customer_ID);
此功能為 mysqlimport 工具所不具備,極大提升遷移彈性。
批次處理適合結構化 SQL 腳本部署;LOAD DATA INFILE 則是大量原始資料(CSV/TSV)高效匯入的首選,支援遠端本地檔案、優先級控制、重複鍵處理與欄位對應,是資料遷移與 ETL 的利器。