有效地更新多行

时间:2012-05-22 11:13:53

标签: java mysql

如何有效更新多行?

  1. 一个陈述
  2. 多个陈述
  3. 单个语句字符串是否会变得太大而无法处理SQL(10000多个条目/行)?

    我有一个要修改的变量,即status

    | id | status |
    

    我的数据存储在List(ArrayList)中。

5 个答案:

答案 0 :(得分:1)

在MySQL中使用Load Data命令可能更有效。您可以将输入结构化为CSV格式。适当地使用REPLACE和/或IGNORE关键字。这将比1000个单独的MySQL语句快得多。

答案 1 :(得分:1)

如果你想使用JDBC并且效率很高,你肯定应该查看关于批量插入性能的this blog post(也适用于更新)。

一般来说,您需要在连接字符串中添加rewriteBatchedStatements=true,例如:

Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/database_name?rewriteBatchedStatements=true","login", "password");

这将允许驱动程序采用准备好的语句并将其重写为更有效的形式。

答案 2 :(得分:0)

参见预备陈述:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

从循环中创建预准备语句,然后在循环内部,只需执行带有更新参数的预准备语句。

答案 3 :(得分:0)

如果您的状态是有限的一组值,那么我将根据状态破坏子集中的列表,而不是更新每个语句的行集。即使特定状态有10K行,您也可以在单个调用中更新多行(使用in运算符)。这将减少应用程序更新所需的往返次数。

答案 4 :(得分:0)

您也可以尝试这样的批量更新,但我不确定它们是否有效:

update `id_status_table` `row`
set `status` = (
    select case `row`.`id` when 1 then 'one'
                           when 2 then 'two'
                           else 'three or more' end
);

虽然10000行的查询字符串可能太大,但您可以将此类查询应用于每1000行。