使用auto_increment列执行插入后,Firebird似乎不支持getGeneratedKeys()。所以我想了解如何在插入后获取生成的密钥。
1)我是否必须使用“插入用户(...)值(...)返回id”并通过CallableStatement调用此方法以获取生成的ID?究竟怎么样?我是否需要将我的插页包裹在“call {...}”
周围2)是否有其他方法可以在Firebird下获取生成的id,某种“select last_id_generated()”。 “从用户中选择最大值(id)”不计算在内。
3)Firebird JDBC驱动程序不支持getGeneratedKeys()吗? (可选)
谢谢!
答案 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以获取更多详细信息。
回答您的原始问题:
执行INSERT ... RETURNING ...
时,您需要使用executeQuery
(或execute
),并处理结果集,就像执行正常SELECT
一样。使用Jaybird 2.2,如果您使用executeUpdate
并使用RETURN_GENERATED_KEYS
getGeneratedKeys()
使用INSERT ... RETURNING ...
或getGeneratedKeys
是获取该语句生成的值的唯一方法,所有其他方法(如SELECT GEN_ID(GEN_NAME,0) FROM RDB$DATABASE
)都不可信任,因为序列不在可能已为不同的并发事务生成了事务控制和返回值。
当你提出这个问题时,Jaybird确实不支持(2.1.6)。
披露:我是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>