Създайте тригерната функция:
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.*