最近,我写了一个 node.js 脚本,每天要循环访问数百万个文件,并将其内容插入 MySQL 数据库。该脚本不是一次处理一条记录,而是将文件内容存储在内存中,然后每 1000 个文件运行一次 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 的命令。这是一个 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 天!