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

sjw*_*ond 4 postgresql triggers stored-procedures insert

假设我有一个表X,并且X有字段X1X2并且X3

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

这是在 mysql 中非常简单的事情,但是在 google 上一段时间后,我找不到 postgres 的一个很好的例子,只有一些关于 For every row 触发器的信息,但同样没有例子。

小智 7

创建触发函数:

create or replace function update_calc_column()
  returns trigger
as
$$
begin
  new.x3 := new.x1 + new.x2;
  return new;
end;
$$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)

创建触发器:

create trigger calc_trigger 
   before insert or update on X
   for each row
   execute procedure update_calc_column();
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

然后您可以使用:

select x.*, x.x3
from x;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle: http: //sqlfiddle.com/#!15/53acf/ 1

然而,这有一个缺点,即您需要显式选择x3列。使用时不会显示x.*