如何在 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 中进行批量插入的主要内容,如果未能解决你的问题,请参考以下文章