Erstellen Sie die Triggerfunktion:
create or replace function update_calc_column()
returns trigger
as
$$
begin
new.x3 := new.x1 + new.x2;
return new;
end;
$$
language plpgsql;
Erstellen Sie den Trigger:
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
Das obige ist im Wesentlichen eine abgespeckte Version des Beispiels im Handbuch
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE
Das Speichern abgeleiteter Daten auf diese Weise ist jedoch normalerweise keine gute Idee. Sie sollten einfach eine Ansicht erstellen, die eine Spalte X3 zurückgibt, die als X1 + X2
definiert ist - viel weniger zu wartender Code und genauso effizient (eigentlich ist es mehr effizient, weil Sie den Trigger-Overhead loswerden).
Eine andere (exotischere) Option besteht darin, die objektorientierte Erweiterung von Postgres zu verwenden und eine virtuelle Spalte zu erstellen:
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;
Sie können dann verwenden:
select x.*, x.x3
from x;
SQLFiddle:http://sqlfiddle.com/#!15/53acf/1
Dies hat jedoch den Nachteil, dass Sie dies explizit tun müssen Wähle das x3
Säule. Es wird nicht angezeigt, wenn x.*
verwendet wird