如何条件序列

how to conditional sequences

我使用触发器在基于

的多列(条件)中自动递增
coalesce (max(id), 1) + 1

它在使用外部签名服务时停止工作,这需要几秒钟的时间,其并发性开始显示重复值。

我最初使用一些条件值的序列解决了这个问题,比如:

CREATE OR REPLACE FUNCTION get_webf_serial() RETURNS trigger AS
$BODY$
begin
if new.serie = 'A' then
   new.folio: = nextval ('seq_A');
elseif new.serie = 'B' then
   new.folio: = nextval ('seq_B');
  else
   new.folio: = nextval ('seq_any');
end if;
return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;

如您所见,我需要一种动态的方式来关联序列,在本例中为 new.serie; elseif 的使用受到限制。

是否有更好的方法来使用条件序列或通过代码模仿序列的行为?

提前致谢

您可以根据 new.serie 的名称创建序列的名称:

CREATE OR REPLACE FUNCTION get_webf_serial() RETURNS trigger AS
$BODY$
declare
    seq_name TEXT := FORMAT('seq_%s', new.serie);
begin
   PERFORM * FROM information_schema.sequences 
       WHERE sequence_schema = 'public' AND sequence_name = seq_name;
   IF NOT FOUND THEN
       seq_name := 'seq_any';
   END IF;
   new.folio: = nextval(seq_name);
   return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;