【发布时间】:2016-01-01 05:04:26
【问题描述】:
我有一个表 PERSON 超过 500 万行,我需要根据同一表中的字段 NAME 更新每个表的字段 NICKNAME。
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)
【问题讨论】:
-
也许考虑使用批处理:stackoverflow.com/questions/14264953/…
-
昵称解析可以用SQL而不是Java吗?那么更新语句会快很多。
-
你为什么说“那将永远需要”?你认为
updateRow()做了什么(在支持它的 JDBC 驱动程序上)?两者都会向服务器发送UPDATESQL 语句。准备UPDATE语句并将它们批处理实际上会更好 提高性能,因为updateRow()没有 批处理。