如何在 MySQL 中进行批量插入

Posted

技术标签:

【中文标题】如何在 MySQL 中进行批量插入【英文标题】:How to do a batch insert in MySQL 【发布时间】:2011-07-28 11:14:45 【问题描述】:

我有 1-many 数量的记录需要输入到表中。在查询中执行此操作的最佳方法是什么?我应该只做一个循环并在每次迭代中插入一条记录吗?还是有更好的办法?

【问题讨论】:

请在尝试使用之前阅读声明或函数的文档。 INSERT supports this natively! 如果您有大量记录并且可以将它们格式化为 CSV 文件,请查看 LOAD DATA INFILE 语句或 mysqlimport 命令。 郑重声明,LOAD DATA 是一个非常灵活的命令,不需要需要 CSV 输入;任何文本格式都可以,并且有许多有用的参数可用于解析和操作输入数据。这绝对是将数据加载到本地数据库中的最快方式。目前尚不清楚上述“最佳”是什么意思:即简单性(使用 INSERT 语句)是否胜过速度(使用 LOAD DATA)。 【参考方案1】:

来自MySQL manual

使用 VALUES 的 INSERT 语句 语法可以插入多行。去做 这包括多个列列表 值,每个包含在 括号并用逗号分隔。 示例:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

【讨论】:

这比 Load Data Infile 慢吗? 在存储过程中写这个插入语句的语法是什么? @Nitin 不会是相同的语法..???这就是我在 SQL Server 中所做的。 请注意,虽然问题被标记为“如何进行 batch 插入”,但这个答案实际上是 bulk 插入。批量通常更快,请参阅this question @Koffeehaus Per this SO answer from @Lukman,可以插入的值/行数受max_allowed_packet的限制【参考方案2】:

大多数时候,您不是在 MySQL 客户端中工作,您应该使用适当的 API 一起批量插入。

例如在 JDBC 中:

connection con.setAutoCommit(false); 
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);                 
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();

prepStmt.setString(1,mgrnum2);                        
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();

int [] numUpdates=prepStmt.executeBatch();

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm

【讨论】:

一篇关于批量插入的好博文(在 Java 中,但它与任何语言都相关):viralpatel.net/blogs/batch-insert-in-java-jdbc 尽管这是一个示例,但在执行批处理后再次打开自动提交可能是个好主意。简要说明它为什么有用也可能有用(可以提高批处理的性能)。哦,哇刚刚意识到这个 q/q 有多大了。【参考方案3】:
Insert into table(col1,col2) select col1,col2 from table_2;

请参考MySQL documentation on INSERT Statement

【讨论】:

insert into select from 的性能如何?它和批量插入一样快吗?【参考方案4】:

在文件中加载数据查询是更好的选择,但是像 godaddy 这样的一些服务器在共享主机上限制了这个选项,所以,只剩下两个选项,然后一个是在每次迭代或批量插入时插入记录,但是批量插入有它的字符限制,如果你查询超过了 mysql 中设置的这个字符数,那么您的查询将崩溃,所以我建议使用批量插入将数据插入块中,这将最大限度地减少与数据库建立的连接数。祝大家好运

【讨论】:

LOAD DATA LOCAL INFILE '/users/name/txt.file'怎么样【参考方案5】:

mysql允许你一次插入多行INSERT manual

【讨论】:

以上是关于如何在 MySQL 中进行批量插入的主要内容,如果未能解决你的问题,请参考以下文章

mysql大批量插入数据的正确做法

MySql批量插入时,如何不插入重复的数据

如何使用 mysljs 在 mySql 和 node.js 中批量插入

mysql批量插入时,如何不插入重复数据

mysql批量插入数据

带有快速数组参数的节点mysql批量插入