如何有效更新多行?
单个语句字符串是否会变得太大而无法处理SQL(10000多个条目/行)?
我有一个要修改的变量,即status
:
| id | status |
我的数据存储在List(ArrayList)中。
答案 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行。