带有两个函数语句的 PostgreSQL 触发器

PostgreSQL Trigger with two function statements

我正在尝试为 2 个不同的函数创建触发器,区别仅在于条件:

CREATE OR REPLACE FUNCTION seculoxxi()
    RETURNS integer AS $total1$
    declare
        total1 integer;
    BEGIN
       SELECT count(*) into total1 
       FROM edicao
       WHERE ano >= 2000;
       RETURN total1;
    END;
    $total1$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION seculoxx()
RETURNS integer AS $total2$
declare
    total2 integer;
BEGIN
   SELECT count(*) into total2 
   FROM edicao
   WHERE ano < 2000;
   RETURN total2;
END;
$total2$ LANGUAGE plpgsql;

table的结构也很简单,一共有三行:

  1. 代码(数字)
  2. 版本(字符)
  3. 年份(整数)

如何创建这个触发器?

这完全是摸不着头脑,但假设您要修改的字段名为 "counters,",那么我认为触发器可能如下所示:

CREATE OR REPLACE FUNCTION edicao_insert_trigger()
  RETURNS trigger AS
$BODY$
DECLARE
  total integer;
BEGIN
  select count (*)
  into total
  from edicao e
  where
    (NEW.ano >= 2000 and e.ano >= 2000) or
    (NEW.ano < 2000 and e.ano < 2000);

  NEW.counter := total;

  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

然后将触发器添加到您的 table:

CREATE TRIGGER insert_edicao_trigger
  BEFORE INSERT
  ON edicao
  FOR EACH ROW
  EXECUTE PROCEDURE edicao_insert_trigger()

现在,当您进行插入时,它应该会自动添加 "counter" 字段的值。

郑重声明,如果您要获取唯一 ID,最好使用序列。

create sequence edicao_gt_2000;
create sequence edicao_lt_2000;

CREATE OR REPLACE FUNCTION edicao_insert_trigger()
  RETURNS trigger AS
$BODY$
BEGIN
  NEW.counter :=
    case
      when NEW.ano >= 2000 then nextval ('edicao_gt_2000')
      else nextval ('edicao_lt_2000')
    end;
  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;