我正在使用SELECT GEN_ID(TABLE,1) FROM MON$DATABASE
中的PreparedStatement
来生成将在多个表格中使用的ID。
我将使用INSERT
批次进行大量PreparedStatement
个操作,我正在寻找一种从Firebird一次获取大量新ID的方法。
执行触发器似乎是不可能的,因为我必须在其他表上使用此代码在Java代码中使用INSERT
。此外,批量的getGeneratedKeys()
似乎尚未在(我的?)Firebird JDBCdriver中实现。
答案 0 :(得分:4)
我在这里回答内存,但我记得我曾经不得不将Quicken文件中的一堆事务加载到我的Firebird数据库中。我加载了一个包含事务的数组,并将一个名为say iCount的变量设置为该数字。然后我从RDB $ DATABASE做了SELECT GEN_ID(g_TABLE,iCount)。这给了我下一个ID,并根据我要插入的记录数增加了生成器。然后我开始一个事务,逐步遍历数组并一个接一个地插入记录并关闭事务。我很惊讶它的速度有多快。我想,当时,我正在处理大约28,000笔交易,时间就像几秒钟。这样的事可能适合你。
答案 1 :(得分:1)
正如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开发者之一