Navicat 部落格

大量插入資料的三種方式 2021 年 3 月 3 日,由 Robert Gravelle 撰寫

最近,我寫了一個 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 顯示的範例陳述式:

bulk_insert (65K)

上面的陳述式經過格式化以提高可讀性,所以在動態產生 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 和許多其他格式:

import_wizard_file_formats (49K)

這個畫面可以選擇記錄分隔字元、欄位分隔字元和文字辨識符號:

import_wizard_delimiters (43K)

Navicat 即時顯示進度:

import_wizard_progress (52K)

完成匯入後,你可以儲存所有設定以便日後使用,這不僅方便你定期執行該設定,而且還允許你設定自動化執行,無需你任何額外干預即可匯入資料。

總結

在今天的文章中,我們介紹了一些用於在 MySQL 和其他 DBMS 執行大量插入的方法。

如果你對 Navicat for MySQL 感興趣,可以免費試用 14 天!

Navicat 文章
頻道記錄
分享
部落格封存檔