我有一个包含超过5百万行的表PERSON
,我需要根据同一个表中的字段NICKNAME
更新每个字段NAME
。
ResultSet rs = statement.executeQuery("select NAME from PERSON");
while(rs.next())
{
// some parsing function like:
// Nickname = myparsingfunction(rs.getString("NAME"));
rs.updateString( "NICKNAME", Nickname );
rs.updateRow();
}
但我收到了这个错误:
未由SQLite JDBC驱动程序实现
我使用在https://bitbucket.org/xerial/sqlite-jdbc/downloads下载的sqlite-jdbc-3.8.11.2.jar。
我知道我可以使用以下SQL查询:
statement.executeUpdate("update PERSONS set NICKNAME = Nickname where ID = Id");
但这需要永远,我理解更新ResultSet
会更快。那么我有什么选择以最快的方式更新表格?还有其他任何司机吗?我应该离开Java吗?
更新
我能够使用以下语法找到快速解决方案。 CASE
和END
之间的块是我在执行SQL查询之前构建的串联字符串,因此我可以一次发送所有更新。
update PERSON
set NICKNAME= case ID
when 173567 then 'blabla'
when 173568 then 'bleble'
...
when 173569 then 'blublu'
end
where ID in (173567, 173568, 173569)
答案 0 :(得分:3)
正如您所遇到的,SQLite JDBC驱动程序当前不支持updateString
操作。这可以在the source code中看到此驱动程序。
我可以想到三个选择:
PreparedStatement.addBatch()
)以提高性能(tutorial)。myparsingfunction
,以便查询可以成为UPDATE PERSONS SET NICKNAME = some_function(NAME)
。创建一个用户定义的函数(使用org.sqlite.Function
),用Java实现,并在SQL中调用它。示例摘自this answer:
Function.create(db.getConnection(), "getNickName", new Function() {
protected void xFunc() throws SQLException {
String name = value_text(0);
String nickName = ...; // implement myparsingfunction here
result(nickName);
}
});
并按照以下方式使用:UPDATE PERSONS SET NICKNAME = getNickName(NAME);
SQLite does not support stored procedures以便该选项不在表格中。
我不确定哪些选项可以提供最佳性能(当然使用纯SQL会更快,但这可能不是一个可行的解决方案)。您应该对每个解决方案进行基准测试,以找到适合您的解决方案。