我正在使用SELECT GEN_ID(TABLE,1) FROM MON$DATABASE中的PreparedStatement生成将在多个表中使用的ID。

我要用INSERT批处理大量的PreparedStatement,并且我正在寻找一种从Firebird一次获取很多新ID的方法。

触发似乎是不可能的,因为我不得不在其他时间使用其他ID在Java代码中的其他表上INSERT。而且,批处理getGeneratedKeys()似乎尚未在(我的?)Firebird JDBCdriver中实现。

最佳答案

正如jrodenhi所说,您可以使用

SELECT GEN_ID(<generator>, <count>) FROM RDB$DATABASE


这将返回比先前生成的键高的<count>值,因此您可以使用(value - count, value]中的所有值(其中(表示互斥,包括])。假设生成器当前的值为10,调用GEN_ID(generator, 10)将返回20,然后可以使用11 ... 20作为id。

这确实假定您通常使用生成器来为表生成ID,并且假定没有应用程序不使用生成器就无法构成自己的ID。

如您所见,Jaybird 2.2.x中的批处理尚未实现getGeneratedKeys()。 Jaybird 3.0.0中将提供对此选项的支持,请参见JDBC-452

除非您还针对其他数据库,否则使用批处理更新(在Jaybird中)并没有真正的性能优势。 Firebird不支持更新批处理,因此Jaybird的内部实现与准备语句并重复执行自己的行为实质上相同。由于计划将其添加到Firebird 4中,因此将来可能会改变。

披露:我是Jaybird开发人员之一

08-15 18:44
查看更多