如何设置初始发电机值?

Dan*_*tra 4 firebird

我需要将新的 Firebird 生成器/序列初始化为现有“旧”表的最大主键值。我尝试了以下操作,但它不起作用,我收到错误“令牌未知 - 第 6 行,第 8 列选择”。我无法手动执行此操作,因为它必须在许多不同的数据库上执行。我使用的是火鸟 2.5.1。

根据http://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/html/langrefupd25-execblock.html这应该有效 - 我做错了什么?

set term #;  
execute block  
as  
declare i int = 0;  
begin  
   i = select max(ID) from OrganizationType_OLU;  
    alter sequence OrganizationType_OLU restart with :i;  
end  
#  
set term ;# 
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 5

一般来说,您可以使用ALTER SEQUENCE

ALTER SEQUENCE sequence-name RESTART WITH <newval>
Run Code Online (Sandbox Code Playgroud)

或者传统选项SET GENERATOR

SET GENERATOR generator-name TO <new-value>
Run Code Online (Sandbox Code Playgroud)

然而,您想从 执行此操作,EXECUTE BLOCK但不能,因为 Firebird 中不允许从 PSQL 代码执行 DDL。所以我想rstrelba 的答案可能是唯一可用的选择。

请注意,虽然序列在 Firebird 中的事务控制之外(它们是原子的),所以请确保仅在您是唯一活动事务时才运行它,否则您可能会将序列重置为无效值。

我强烈建议确保IDforOrganizationType_OLU始终按顺序生成,并且绝不允许用户为这些列指定值。这确保了序列值始终有效(即:不会太低,导致违反主键约束)。