说我有一个表X
,而X
包含字段X1
,X2
和X3
。
我想要一个解决方案,每当我插入X1
和X2
的值时,X3
会自动设置为带触发的X1和X2之和。
这在mysql中非常简单,但是在谷歌上一段时间后我无法找到一个关于postgres的好例子,只是关于For each row触发器的一些信息,但是再次没有例子。
答案 0 :(得分:0)
创建触发器功能:
create or replace function update_calc_column()
returns trigger
as
$$
begin
new.x3 := new.x1 + new.x2;
return new;
end;
$$
language plpgsql;
创建触发器:
create trigger calc_trigger
before insert or update on X
for each row
execute procedure update_calc_column();
SQLFiddle:http://sqlfiddle.com/#!15/7ed21/1
以上基本上是手册中示例的精简版本 http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE
然而,存储这样的派生数据通常不是一个好主意。您应该只创建一个返回列X3的视图,该列定义为X1 + X2
- 维护的代码要少得多,同样有效(实际上它的更多效率因为你得到了摆脱触发器开销)。
另一种(更具异国情调的)选择是使用Postgres'面向对象的扩展并创建一个虚拟列:
create or replace function x3(data X) --<< yes, the type of the parameter is the name of the table
returns integer
as
$$
select data.x1 + data.x2;
$$
language sql;
然后您可以使用:
select x.*, x.x3
from x;
SQLFiddle:http://sqlfiddle.com/#!15/53acf/1
但缺点是您需要明确选择x3
列。使用x.*