Java SQLite JDBC驱动程序未实现UpdateString

Java SQLite JDBC驱动程序未实现UpdateString,java,sqlite,jdbc,Java,Sqlite,Jdbc,我有一个表PERSON,其中有500多万行,我需要根据同一个表中的字段名称更新每个表上的字段昵称 ResultSet rs = statement.executeQuery("select NAME from PERSON"); while(rs.next()) { // some parsing function like: // Nickname = myparsingfunction(rs.getString("NAME")); rs.updateString( "

我有一个表
PERSON
,其中有500多万行,我需要根据同一个表中的字段
名称
更新每个表上的字段
昵称

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驱动程序实现的

我使用的是从下载的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)

正如您所遇到的,SQLite JDBC驱动程序目前不支持
updateString
操作。这可以在这个驱动程序中看到

我可以想出三个选择:

  • 正如您在问题中所述,您可以选择此人的姓名和ID,然后根据其ID更新此人。这些更新可以批量完成(使用)以提高性能()
  • 在纯SQL中实现方法
    myparsingfunction
    ,这样查询就可以变成
    updatepersonsetnickname=some_函数(NAME)
  • 创建一个用Java实现的用户定义函数(使用),并在SQL中调用它。示例取自:

    并像这样使用:
    updatepersonsetnickname=getNickName(NAME)

  • SQLite,因此该选项不在表中


    我不确定这些选项中的哪一个会提供最好的性能(当然使用纯SQL会更快,但这可能不是一个可行的解决方案)。您应该对每个解决方案进行基准测试,以找到适合您的解决方案。

    也许可以考虑使用批处理:昵称解析是否可以用SQL而不是Java来完成?那么update语句会快得多。你为什么说“那会花很长时间”?您认为
    updateRow()
    在支持它的JDBC驱动程序上有什么作用?两者都将向服务器发送
    UPDATE
    SQL语句。准备一个
    UPDATE
    语句并对它们进行批处理实际上会提高性能,因为
    updateRow()
    不是批处理的。
    Function.create(db.getConnection(), "getNickName", new Function() {
        protected void xFunc() throws SQLException {
            String name = value_text(0);
            String nickName = ...; // implement myparsingfunction here
            result(nickName);
        }
    });