如何将Firebird 2.5的生成器设置为列的最大值
如何将Firebird 2.5中的生成器设置为列的最大值
我尝试了以下语句:
ALTER SEQUENCE GEN_ID_PROCESSO_ITEM RESTART WITH (SELECT max(id_processo_item) FROM LICITACAO_PROCESSO_ITEM )
SET GENERATOR GEN_ID_PROCESSO_ITEM TO (SELECT MAX(ID_processo_item ) + 1 FROM licitacao_processo_item)
解决方法
Firebird 2.5不允许在SET GENERATOR或ALTER SEQUENCE RESTART WITH中直接使用子查询。要完成这个操作,需要借助执行块先获取最大值,再设置生成器:
EXECUTE BLOCK AS DECLARE var_max_id INTEGER; BEGIN -- 获取列的最大值 SELECT MAX(id_processo_item) INTO var_max_id FROM LICITACAO_PROCESSO_ITEM; -- 如果表不为空,设置生成器到最大值 IF var_max_id IS NOT NULL THEN SET GENERATOR GEN_ID_PROCESSO_ITEM TO var_max_id; -- 若表为空,可根据需求设置初始值,比如取消下面注释: -- ELSE -- SET GENERATOR GEN_ID_PROCESSO_ITEM TO 0; END
如果需要让生成器的下一个自增值为最大值+1,可改用COALESCE处理空值情况:
EXECUTE BLOCK AS DECLARE var_max_id INTEGER; BEGIN SELECT COALESCE(MAX(id_processo_item), 0) INTO var_max_id FROM LICITACAO_PROCESSO_ITEM; SET GENERATOR GEN_ID_PROCESSO_ITEM TO var_max_id; END
调用GEN_ID(GEN_ID_PROCESSO_ITEM, 1)时会返回var_max_id + 1,符合自增逻辑。
内容的提问来源于stack exchange,提问作者Diego Alves
相关产品推荐
相关产品推荐

