最近,我寫了一個 node.js 指令碼,每天逐一查看數百萬個檔案,並將其內容插入 MySQL 資料庫。該指令碼不是一次處理一筆記錄,而是將檔案內容儲存在記憶體中,然後每 1000 個檔案執行一次 INSERT 陳述式。為此,我使用了 INSERT 陳述式的大量插入形式。你可以根據你的特定需求選擇使用其他方案。在今天的文章中,我們將介紹一些替代方案。
大量插入資料的 INSERT 陳述式變化
INSERT 陳述式支援多種語法變化,其中之一是用於同時插入多列。為此,我們只需要將每個值列表括在括號中並使用逗號將它們分開:
INSERT INTO table_name (column_list) VALUES (value_list_1), (value_list_2), ... (value_list_n);
很簡單。以下是在 Navicat for MySQL 顯示的範例陳述式:
上面的陳述式經過格式化以提高可讀性,所以在動態產生 SQL 時你不必擔心陳述式的可讀性。只要語法在語義上正確,它就可以正常工作。最後,請注意,使用 INSERT 陳述式一次只能插入最多 1000 列。
LOAD DATA INFILE
對於不希望撰寫指令碼的人來說,另一種選擇是使用如 LOAD DATA INFILE 之類。這是一個 MySQL 特定的命令,但是大多數其他資料庫系統(DBMS)也支援類似的命令。它可以匯入各種分隔的檔案格式,包括逗號(CSV)、定位字元(TDV)等。
以下是將「c:\tmp\discounts.csv」檔案的資料匯入 discounts 資料表的陳述式:
LOAD DATA INFILE 'c:/tmp/discounts.csv' INTO TABLE discounts FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
上面的陳述式使用了 IGNORE 1 ROWS 選項來略過標題。
我本來想使用這種方法來匯入資料,但是我們要匯入的檔案採用了高度專業化和複雜的格式,需要大量的前端邏輯。
使用匯入公用程式
還有一種方法是使用匯入公用程式,例如 Navicat 的「匯入精靈」。你能想像的任何格式它幾乎都可以支援,包括 CSV、Excel、HTML、XML、JSON 和許多其他格式:
這個畫面可以選擇記錄分隔字元、欄位分隔字元和文字辨識符號:
Navicat 即時顯示進度:
完成匯入後,你可以儲存所有設定以便日後使用,這不僅方便你定期執行該設定,而且還允許你設定自動化執行,無需你任何額外干預即可匯入資料。
總結
在今天的文章中,我們介紹了一些用於在 MySQL 和其他 DBMS 執行大量插入的方法。
如果你對 Navicat for MySQL 感興趣,可以免費試用 14 天!