我需要将新的 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)
一般来说,您可以使用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始终按顺序生成,并且绝不允许用户为这些列指定值。这确保了序列值始终有效(即:不会太低,导致违反主键约束)。