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 文章
频道条目
分享
文章归档