PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Procédure de déclenchement Postgres lors de l'insertion utilisant des données dans des champs insérés pour insérer des données calculées dans un autre champ

Créez la fonction de déclenchement :

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

Créez le déclencheur :

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

Ce qui précède est essentiellement une version simplifiée de l'exemple du manuel
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE

Cependant, stocker des données dérivées de cette manière n'est généralement pas une bonne idée. Vous devez simplement créer une vue qui renvoie une colonne X3 qui est définie comme X1 + X2 - beaucoup moins de code à maintenir et tout aussi efficace (en fait c'est plus efficace car vous vous débarrassez de la surcharge du déclencheur).

Une autre option (plus exotique) consiste à utiliser l'extension orientée objet de Postgres et à créer une colonne virtuelle :

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;

Vous pouvez ensuite utiliser :

select x.*, x.x3
from x;

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

Cela a cependant l'inconvénient que vous devez explicitement sélectionnez le x3 colonne. Il n'apparaîtra pas lors de l'utilisation de x.*