Postgres使用插入字段中的数据触发插入过程以在另一个字段中插入计算数据

时间:2016-05-10 14:50:21

标签: postgresql stored-procedures triggers insert

说我有一个表X,而X包含字段X1X2X3

我想要一个解决方案,每当我插入X1X2的值时,X3会自动设置为带触发的X1和X2之和。

这在mysql中非常简单,但是在谷歌上一段时间后我无法找到一个关于postgres的好例子,只是关于For each row触发器的一些信息,但是再次没有例子。

1 个答案:

答案 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.*

时,它不会显示