我使用JDBC的batchUpdate
功能将大量数据插入到具有自动生成密钥的表中。因为JDBC没有说明batchUpdate
和getAutogeneratedKeys
的任何内容,所以我需要一些独立于数据库的解决方法。
我的想法:
在插入之前以某种方式从数据库中提取下一个分发的序列,然后手动使用这些键。但是JDBC没有getTheNextFutureKeys(howMany)
。那么怎么做呢?拉动钥匙,例如在Oracle还事务保存?因此,只有一个事务可以提取相同的未来密钥集。
添加一个虚假ID的额外列,该列只在交易期间有效。
使用所有其他列作为辅助键来获取生成的密钥。这实际上不是3NF符合......
是否有更好的想法或如何以一般化的方式使用创意1?
答案 0 :(得分:2)
部分答案
拉动钥匙,例如在Oracle中还有事务保存吗?
是的,从序列中获取值是事务安全的,我的意思是即使您回滚事务,在任何情况下都不会再次返回DB返回的序列值。
因此,您可以从序列中预取id-s并在批量插入中使用它们。
答案 1 :(得分: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
结合使用虽然,这种组合似乎相当重要,但请参阅此主题。 我很想尝试这个,如果你没有成功,就可以回到序列中的预取。
答案 2 :(得分:0)
getAutogeneratedKeys()
也可以使用批量更新。
它返回一个带有所有新创建的ID的ResultSet - 而不仅仅是一个值。
但是这需要在INSERT操作期间通过触发器填充ID。