我正在使用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开发人员之一