同库表数据迁移问题: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
相关产品推荐
相关产品推荐

