PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres-Trigger-Prozedur beim Einfügen unter Verwendung von Daten in eingefügten Feldern, um berechnete Daten in ein anderes Feld einzufügen

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