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

时间:2011-09-29 22:15:57

标签: java sql database jdbc firebird

使用auto_increment列执行插入后,Firebird似乎不支持getGeneratedKeys()。所以我想了解如何在插入后获取生成的密钥。

1)我是否必须使用“插入用户(...)值(...)返回id”并通过CallableStatement调用此方法以获取生成的ID?究竟怎么样?我是否需要将我的插页包裹在“call {...}”

周围

2)是否有其他方法可以在Firebird下获取生成的id,某种“select last_id_generated()”。 “从用户中选择最大值(id)”不计算在内。

3)Firebird JDBC驱动程序不支持getGeneratedKeys()吗? (可选)

谢谢!

4 个答案:

答案 0 :(得分:2)

事实证明,您所要做的就是使用executeQuery(来自PreparedStatement)而不是executeUpdate调用“insert ... returns”。这将返回您的ResultSet,您可以从中获取生成的ID。我从没想过你可以使用executeQuery调用INSERT。我以为你必须做executeUpdate。

答案 1 :(得分:2)

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

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 )
{}

现在buf包含id

< *> - 您可以通过IBExpert帮助看到它。

答案 2 :(得分:0)

在Jaybird 2.2中添加了对getGeneratedKeys的支持。有一些警告,默认的RETURN_GENERATED_KEYS方法将返回表的所有列,因此您应该按列名从结果集中检索列,或者使用其中一种方法来显式指定列索引或列名称,请参阅Jaybird (2.2.7) release notes以获取更多详细信息。

回答您的原始问题:

  1. 执行INSERT ... RETURNING ...时,您需要使用executeQuery(或execute),并处理结果集,就像执行正常SELECT一样。使用Jaybird 2.2,如果您使用executeUpdate并使用RETURN_GENERATED_KEYS

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

  4. 当你提出这个问题时,Jaybird确实不支持(2.1.6)。

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

答案 3 :(得分:-1)

这将获得当前一代

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列< / p>