我有一张 table PERSON
超过 500 万行,我需要更新字段 NICKNAME
基于领域的每一个NAME
在同一张 table 内。
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();
}
但是我得到了这个错误:
not implemented by SQLite JDBC driver
我正在使用在 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
之间的 block 和 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)
最佳答案
正如您所遇到的,SQLite JDBC 驱动程序目前不支持 updateString
操作。这可以在 the source code 中看到对于这个司机。
我可以想到三个选项:
- 正如您在问题中所述,您可以选择此人的姓名和 ID,然后通过其 ID 更新此人。这些更新可以批量完成(使用
PreparedStatement.addBatch()
)以提高性能 ( tutorial )。 - 在纯 SQL 中实现方法
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 会更快,但这可能不是一个可行的解决方案)。您应该对每种解决方案进行基准测试,以找到适合您的解决方案。
关于java - UpdateString 未由 SQLite JDBC 驱动程序实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32933384/