如何条件序列

时间:2018-01-13 12:05:30

标签: postgresql triggers 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是有限制的。

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

提前致谢

1 个答案:

答案 0 :(得分:0)

您可以根据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;