如何在MySQL中进行批量插入

209

我有1到多个需要插入到表格中的记录。在查询中,最佳的方法是什么?我应该只制作一个循环,并在每次迭代中插入一条记录吗?还是有更好的方法?


2
在尝试使用语句或函数之前,请先阅读其文档。INSERT本身支持此功能 - Lightness Races in Orbit
3
如果您有大量记录并且可以将它们格式化为CSV文件,请查看LOAD DATA INFILE语句或mysqlimport命令。 - squawknull
1
顺便说一下,LOAD DATA 是一个非常灵活的命令,不 需要 CSV 输入; 任何文本格式都可以,并且有许多有用的参数可以解析和操作输入数据。这绝对是将数据加载到本地db中的最快方法。不清楚上面的“最佳”是什么意思:即使用 INSERT 语句的简单性超过速度 (使用 LOAD DATA)。 - EdwardG
6个回答

381

摘自MySQL手册

使用VALUES语法的INSERT语句可以插入多行数据。为了实现这一点,需要包含多个列值列表,每个列表都用括号括起来,并用逗号隔开。例如:

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

10
这比使用Load Data Infile慢吗? - srchulo
1
在存储过程中编写此插入语句的语法是什么? - Nitin Sawant
1
@Nitin 那不是相同的语法吗..??? 无论如何,在 SQL Server 中我会这样做。 - Ads
26
请注意,虽然问题标签为“如何执行批量插入”,但这个答案实际上是批量插入。通常情况下,批量插入速度更快,请参考这个问题 - Mike Demenok
3
根据@Lukman在此Stack Overflow答案中提到的,可以插入的值/行数受max_allowed_packet限制。你可以在max_allowed_packet中找到更多信息。 - Sepster
显示剩余2条评论

27

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


6
一篇关于批量插入的好博客文章(使用Java作为示例,但适用于任何语言):http://viralpatel.net/blogs/batch-insert-in-java-jdbc/ - Kangur
尽管这只是一个例子,但在执行批处理后再次打开自动提交可能是个好主意。同时简要说明一下为什么它有用(可以提高批处理的性能),这也可能很有用。哦,天啊,我刚刚意识到这个问题已经很老了。 - Ben

11

insert into select from 的性能如何?它的速度和批量插入一样快吗? - hiway

11

使用“load data infile”查询是更好的选择,但像Godaddy这样的某些服务器在共享主机上限制了此选项,因此只剩下两个选项,一个是在每次迭代或批量插入时插入记录,但是如果您的查询超过mysql中设置的字符数限制,则查询将崩溃。因此,我建议使用批处理插入将数据分块插入,这将最小化与数据库建立的连接数量。祝大家好运。


2
LOAD DATA LOCAL INFILE '/users/name/txt.file' 怎么样? - double_j

2

1

将以下内容插入到test_1表中:(24, 'B', '1990-12-07'), (25, 'C', '1990-12-08')


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - ahuemmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接