Firebird + JDBC:从插入中获取生成的键



看起来火鸟不支持getGeneratedKeys()后,您执行插入与auto_increment列。因此,我想了解如何在插入后获得生成的键。

1)我是否必须使用"插入到用户(…)值(…)返回id",并通过CallableStatement调用它,以获得生成的id ?如何?我是否需要在"call{…} "

2)是否有一些其他的方法来获得在火鸟下生成的id,某种"选择last_id_generated()"。"select max(id) from users"不算数。

3)是不是真的,getGeneratedKeys()是不支持的火鸟JDBC驱动程序?(可选)

谢谢!

事实证明,你所要做的就是调用"insert…使用executeQuery(来自PreparedStatement)而不是executeUpdate返回"。这将返回ResultSet,您可以从中获得生成的id。我从未想过可以用executeQuery调用INSERT。我以为你必须用executeUpdate。

我正在使用构造来获取主键值:

String buf =       
             "SELECT GEN_ID ( <YOUR_ID_NAME*>, 0 ) " + //see description below
             "FROM RDB$DATABASE";
try
{
    Statement stm = conn.createStatement ();
    ResultSet RS = stm.executeQuery ( buf );
    buf = null;
    if ( RS != null )
    {
        RS.next ();
        buf = RS.getString ( 1 ).trim (); //That is it
        RS.close ();
    }
}
catch ( SQLException e )
{}

现在包含id

< *> -你可以在ibeexpert的帮助下看到它

在Jaybird 2.2中增加了对getGeneratedKeys的支持。有一些注意事项,默认的RETURN_GENERATED_KEYS方法将返回表的所有列,因此您应该通过列名从结果集中检索列,或者使用其中一种方法显式指定列索引或列名,有关详细信息,请参阅Jaybird(2.2.7)发布说明。

回答你最初的问题:

  1. 当您执行INSERT ... RETURNING ...时,您需要使用executeQuery(或execute),并像执行正常的SELECT一样处理结果集。在Jaybird 2.2中,如果您正在使用RETURN_GENERATED_KEYS,也可以使用executeUpdate,并从getGeneratedKeys()

  2. 获取结果集。
  3. 使用INSERT ... RETURNING ...getGeneratedKeys是获得该语句生成值的唯一方法,所有其他方法(如SELECT GEN_ID(GEN_NAME,0) FROM RDB$DATABASE)都不能被信任,因为序列不在事务控制范围内,并且返回值可能已经为不同的并发事务生成。

  4. 在你问这个问题的时候,它确实不被Jaybird(2.1.6)支持。

披露:我是Jaybird的开发者之一。

这将获得当前生成

SELECT GEN_ID(GEN_NAME,0) FROM RDB$DATABASE

, GEN_NAME是你对那一代的称呼

当你创建一个自动增量字段一个触发器和一个生成被创建时触发器通常是这样的

SET TERM ^^ ;
CREATE TRIGGER TABLE_BEFOREINSERT FOR TABLE ACTIVE BEFORE INSERT POSITION 0 AS
BEGIN
  if ( new.ID is null )
  then new.ID = gen_id(GEN_TABLE, 1);
END ^^
SET TERM ; ^^

,生成的创建看起来像这样

CREATE GENERATOR GEN_TABLE;
SET GENERATOR GEN_TABLE TO 32;

这两个组合在一起使得在插入新行之前,它检查您是否指定了ID的值,如果没有,它将生成1并获得其当前值并将其作为ID列

相关内容

  • 没有找到相关文章

最新更新