You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同库表数据迁移问题:ResultSet插入报错及实现方案咨询

同一数据库表数据迁移的正确实现方式

你之前的代码报错是因为:通过executeQuery("SELECT * FROM table2")获取的ResultSet默认是只读且不可更新的,空结果集状态下无法执行insertRow()操作,这就是"The result set is closed."错误的根源。而且用ResultSet直接操作插入的思路本身就不合理,正确的实现方式有以下两种:

1. 纯SQL迁移(推荐,效率最高)

因为是同一数据库,直接用INSERT...SELECT语句完成字段映射和数据迁移,无需Java代码参与,数据库层面直接执行,速度最快:

INSERT INTO table2 (PersonID, field2, field3, field4, field5)
SELECT PersonID, City, Address, LastName, FirstName FROM table1;

字段严格对应:table2的PersonID对应table1的PersonID,field2对应City,field3对应Address,field4对应LastName,field5对应FirstName,完全匹配你的迁移需求。

2. Java代码逐行迁移(适合需要中间处理数据的场景)

如果必须通过Java代码处理(比如迁移前需修改数据),使用PreparedStatement执行插入操作,示例代码如下:

// 假设conn是已建立的数据库连接对象
try (
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT PersonID, City, Address, LastName, FirstName FROM table1");
    PreparedStatement insertStmt = conn.prepareStatement("INSERT INTO table2 (PersonID, field2, field3, field4, field5) VALUES (?, ?, ?, ?, ?)")
) {
    while (rs.next()) {
        // 按参数顺序设置对应字段的值
        insertStmt.setInt(1, rs.getInt("PersonID"));
        insertStmt.setString(2, rs.getString("City"));
        insertStmt.setString(3, rs.getString("Address"));
        insertStmt.setString(4, rs.getString("LastName"));
        insertStmt.setString(5, rs.getString("FirstName"));
        
        // 执行单条插入
        insertStmt.executeUpdate();
    }
} catch (SQLException e) {
    e.printStackTrace();
}
  • 用try-with-resources自动关闭资源,避免内存泄漏;
  • 预编译语句PreparedStatement比拼接SQL更安全、高效。

补充说明

你提到的updateRow()方法是用来修改ResultSet中已存在的行,并非插入新行。就算要通过ResultSet插入,也需要创建可更新的ResultSet,但这种方式繁琐且效率极低,完全不适合表迁移场景。

内容的提问来源于stack exchange,提问作者Serphentelm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:05:31