如果我的 table 没有记录,我如何获得下一个生成器值?

How can I get the next generator value if my table has no records?

我正在使用 Firebird 作为我的数据库,我想知道如何在没有数据时 select 我的 table 的下一个生成器值?目前我正在使用这个脚本:

SELECT GEN_ID(" + sGEN_NAME + ", 1) FROM sGEN_TABLE

如果我的 table 上有记录,这就可以正常工作,否则将无法工作! 我在想做一个"helper INSERT",然后做select得到GEN_VALUE,然后删除记录。但是看起来好乱,还有别的方法吗?

所以我找到了答案,只需要将table的名字替换为rdb$database

使用RDB$DATABASE单行系统table是最简单和惯用的方式。

但是,为了完整起见,还有一种方法。

https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-execblock.html

EXECUTE BLOCK 
  RETURNS (next_val integer /* BigInt in Firebird 3 */ )
AS
BEGIN
  next_val = GEN_ID ( gen_name, +1 ); 
END

此外,更多 SQL 风格的方法是用标准 NEXT VALUE FOR xxx 替换灵活的 IB/FB-specific GEN_ID ( xxx, +1 )

https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-commons-expressions.html#fblangref25-commons-conditional-nxtvlufor

此外,"select the next generator value of my table" 的任务听起来很奇怪。 为什么你会想要这样做? 在现代 Firebird 中,这应该是一些非常特殊的利基案例,当您实际上需要为如此简单的任务浪费一个独立的 select 查询时。 通常你只是在插入时立即获取表单生成器,例如通过一个相同的命令

INSERT INTO Table1( ID, Column1, Column2 ...)
VALUES ( GEN_ID(gen_name, +1), ? /* Param 1 */, ? /* Param 2 */ ...)
RETURNING ID

或者,如果您将 ID 赋值到 BEFORE UPDATE OR INSERT SQL 触发器中,只需

INSERT INTO Table1( Column1, Column2 ...)
VALUES ( ? /* Param 1 */, ? /* Param 2 */ ...)
RETURNING ID

您发送到服务器的查询越少 - 它工作得越快(请参阅:网络延迟、往返)并且您必须出错的代码越少。