1

batchUpdate我使用JDBC的功能将大量数据插入到带有自动生成键的表中。因为 JDBC 什么也没说batchUpdategetAutogeneratedKeys我需要一些独立于数据库的解决方法。

我的想法:

  1. 在插入然后手动使用密钥之前,以某种方式从数据库中提取下一个分发的序列。但是 JDBC 没有getTheNextFutureKeys(howMany). 那么如何做到这一点呢?是否在 Oracle 中提取密钥也保存事务?因此,只有一个事务可以提取相同的一组未来密钥。

  2. 添加一个带有仅在交易期间有效的假 id 的额外列。

  3. 使用所有其他列作为辅助键来获取生成的键。这不是真正符合 3NF 的...

是否有更好的想法或者我如何以通用方式使用想法 1?

4

3 回答 3

2

部分回答

是否在 Oracle 中提取密钥也保存事务?

是的,从序列中获取值是事务安全的,我的意思是即使您回滚事务,数据库返回的序列值在任何情况下都不会再次返回。

因此,您可以从序列中预取 id-s 并在批量插入中使用它们。

于 2011-08-29T14:52:46.570 回答
1

从来没有遇到过这个,所以我潜入了一点。首先,有一种方法可以从 JDBC 语句中检索生成的 id:

String sql = "INSERT INTO AUTHORS (LAST, FIRST, HOME) VALUES " +
               "'PARKER', 'DOROTHY', 'USA', keyColumn";

int rows = stmt.executeUpdate(sql, 
               Statement.RETURN_GENERATED_KEYS);

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
         ResultSetMetaData rsmd = rs.getMetaData();
         int colCount = rsmd.getColumnCount();
         do {
             for (int i = 1; i <= colCount; i++) {
                 String key = rs.getString(i);
                 System.out.println("key " + i + "is " + key);
             }
         }
         while (rs.next();)
} 
else {
         System.out.println("There are no generated keys.");
}

看到这个http://download.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/statement.html#1000569

此外,理论上它可以与 JDBC batchUpdate结合使用

虽然,这种组合似乎相当重要,但请参考这个线程。我建议试试这个,如果你不成功,就回退到从序列中预取。

于 2011-08-29T15:28:12.490 回答
0

getAutogeneratedKeys()据我所知,也可以进行批量更新。

它返回一个包含所有新创建的 id 的 ResultSet - 而不仅仅是一个值。

但这需要在 INSERT 操作期间通过触发器填充 ID。

于 2011-08-29T15:27:06.733 回答