带有两个函数语句的 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的结构也很简单,一共有三行:
- 代码(数字)
- 版本(字符)
- 年份(整数)
如何创建这个触发器?
这完全是摸不着头脑,但假设您要修改的字段名为 "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;
我正在尝试为 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的结构也很简单,一共有三行:
- 代码(数字)
- 版本(字符)
- 年份(整数)
如何创建这个触发器?
这完全是摸不着头脑,但假设您要修改的字段名为 "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;