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

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

【问题讨论】:

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

标签: mysql sql database insert


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多