如果我的 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是最简单和惯用的方式。
但是,为了完整起见,还有一种方法。
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 )
。
此外,"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
您发送到服务器的查询越少 - 它工作得越快(请参阅:网络延迟、往返)并且您必须出错的代码越少。
我正在使用 Firebird 作为我的数据库,我想知道如何在没有数据时 select 我的 table 的下一个生成器值?目前我正在使用这个脚本:
SELECT GEN_ID(" + sGEN_NAME + ", 1) FROM sGEN_TABLE
如果我的 table 上有记录,这就可以正常工作,否则将无法工作! 我在想做一个"helper INSERT",然后做select得到GEN_VALUE,然后删除记录。但是看起来好乱,还有别的方法吗?
所以我找到了答案,只需要将table的名字替换为rdb$database
使用RDB$DATABASE
单行系统table是最简单和惯用的方式。
但是,为了完整起见,还有一种方法。
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 )
。
此外,"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
您发送到服务器的查询越少 - 它工作得越快(请参阅:网络延迟、往返)并且您必须出错的代码越少。