UpdateString未由SQLite JDBC驱动程序实现

时间:2015-10-04 12:20:22

标签: java sqlite jdbc

我有一个包含超过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吗?

更新

我能够使用以下语法找到快速解决方案。 CASEEND之间的块是我在执行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)

1 个答案:

答案 0 :(得分:3)

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

我可以想到三个选择:

  1. 正如您在问题中所述,您可以选择此人的姓名和ID,然后按ID更新此人。这些更新可以批量完成(使用PreparedStatement.addBatch())以提高性能(tutorial)。
  2. 在纯SQL中实现方法myparsingfunction,以便查询可以成为UPDATE PERSONS SET NICKNAME = some_function(NAME)
  3. 创建一个用户定义的函数(使用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);

  4. SQLite does not support stored procedures以便该选项不在表格中。

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