Java 在Firebird中为准备好的语句批同时生成多个ID

Java 在Firebird中为准备好的语句批同时生成多个ID,java,sql,prepared-statement,firebird,jaybird,Java,Sql,Prepared Statement,Firebird,Jaybird,我正在使用SELECT GEN_IDTABLE,1 FROM MON$DATABASE FROM PreparedStatement生成一个ID,该ID将在多个表中使用 我将对PreparedStatements批处理进行大量插入,我正在寻找一种从Firebird一次获取大量新ID的方法 执行触发器似乎是不可能的,因为我必须在Java代码中使用此ID在其他表上插入。此外,批次的getGeneratedKeys似乎还没有在my™中实现?Firebird JDBCdriver。我是从内存中回答的,但

我正在使用SELECT GEN_IDTABLE,1 FROM MON$DATABASE FROM PreparedStatement生成一个ID,该ID将在多个表中使用

我将对PreparedStatements批处理进行大量插入,我正在寻找一种从Firebird一次获取大量新ID的方法


执行触发器似乎是不可能的,因为我必须在Java代码中使用此ID在其他表上插入。此外,批次的getGeneratedKeys似乎还没有在my™中实现?Firebird JDBCdriver。

我是从内存中回答的,但我记得我曾经不得不将一系列事务从Quicken文件加载到我的Firebird数据库中。我加载了一个包含事务的数组,并将一个名为say iCount的变量设置为数字。然后,我从RDB$数据库中选择了GEN_IDg_表iCount。这给了我下一个ID,并使生成器增加了我要插入的记录数。然后,我启动了一个事务,遍历数组,一个接一个地插入记录并关闭事务。我很惊讶这一切进展得如此之快。我想,当时我正在处理大约28000笔交易,时间大概只有几秒钟。像这样的东西可能对你有用。

我在这里是凭记忆回答的,但我记得我曾经不得不从Quicken文件将一系列事务加载到我的Firebird数据库中。我加载了一个包含事务的数组,并将一个名为say iCount的变量设置为数字。然后,我从RDB$数据库中选择了GEN_IDg_表iCount。这给了我下一个ID,并使生成器增加了我要插入的记录数。然后,我启动了一个事务,遍历数组,一个接一个地插入记录并关闭事务。我很惊讶这一切进展得如此之快。我想,当时我正在处理大约28000笔交易,时间大概只有几秒钟。类似的东西可能适合您。

正如jrodenhi所说,您可以使用

SELECT GEN_ID(<generator>, <count>) FROM RDB$DATABASE
这将返回一个高于先前生成的键的值,因此您可以使用value-count,value]中的所有值,其中表示独占,]包含。假设generator当前的值为10,调用GEN_IDgenerator,10将返回20,然后可以使用11…20作为ID

这确实假设您通常使用生成器为表生成ID,并且没有应用程序在不使用生成器的情况下生成自己的ID

正如您所注意到的,在Jaybird 2.2.x中还没有为批实现getGeneratedKeys。Jaybird 3.0.0中将提供对该选项的支持,请参阅

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


披露:我是Jaybird开发者之一

正如jrodenhi所说,您可以使用

SELECT GEN_ID(<generator>, <count>) FROM RDB$DATABASE
这将返回一个高于先前生成的键的值,因此您可以使用value-count,value]中的所有值,其中表示独占,]包含。假设generator当前的值为10,调用GEN_IDgenerator,10将返回20,然后可以使用11…20作为ID

这确实假设您通常使用生成器为表生成ID,并且没有应用程序在不使用生成器的情况下生成自己的ID

正如您所注意到的,在Jaybird 2.2.x中还没有为批实现getGeneratedKeys。Jaybird 3.0.0中将提供对该选项的支持,请参阅

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


披露:我是Jaybird开发者之一

返回的id是按iCount递增后的生成器值返回的id是按iCount递增后的生成器值