如何在MySQL中进行批量插入


148

我有许多记录需要输入到表中。在查询中执行此操作的最佳方法是什么?我是否应该进行循环并在每次迭代中插入一条记录?或者,还有更好的方法?


1
在尝试使用某个语句或函数之前,请先阅读该文档。INSERT本机支持
Lightness Races in Orbit 3'3

3
如果您有大量记录,并且可以将它们格式化为CSV文件,请签出LOAD DATA INFILE语句或mysqlimport命令。
squawknull

作为记录,LOAD DATA是一个非常灵活的命令,不需要 CSV输入。任何文本格式都可以,并且有很多有用的参数可以解析和处理输入数据。这绝对是将数据加载到本地数据库的最快方法。目前尚不清楚上面的“最佳”是什么意思:即简单性(使用INSERT语句)是否胜过速度(使用LOAD DATA)。
EdwardGarson

Answers:


298

MySQL手册

使用VALUES语法的INSERT语句可以插入多行。为此,请包括多个列值列表,每个列值括在括号内并用逗号分隔。例:

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

7
这比加载数据文件慢吗?
srchulo 2012年

在存储过程中写入此插入语句的语法是什么?
Nitin Sawant 2013年

@Nitin不会是相同的语法.. ??? 无论如何,这就是我在SQL Server中要做的事情。
广告

13
请注意,虽然该问题标记为“如何批量插入”,但该答案实际上是批量插入。散装

2
@Koffeehaus根据@Lukman的这个SO回答,可插入的值/行的数量受max_allowed_packet
Sepster

22

在大多数情况下,您不在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


5
关于批量插入的一个不错的博客文章(使用Java,但是与任何语言都有关): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur,2012年


6

在文件查询中加载数据是更好的选择,但是像Godaddy这样的某些服务器在共享主机上限制了此选项,因此,仅剩下两个选项,然后一个是每次迭代或批量插入时的插入记录,但是如果查询超出此限制,则批量插入具有其字符数限制在mysql中设置的字符数会导致查询崩溃,所以我建议用批量插入将数据插入块中,这样可以减少与数据库建立的连接数。


1
怎么样LOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.