PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Procedura di attivazione di Postgres all'inserimento utilizzando i dati nei campi inseriti per inserire i dati calcolati in un altro campo

Crea la funzione di attivazione:

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

Crea il 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

Quanto sopra è essenzialmente una versione ridotta dell'esempio nel manuale
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE

Tuttavia, la memorizzazione di dati derivati ​​del genere di solito non è una buona idea. Dovresti semplicemente creare una vista che restituisca una colonna X3 che è definita come X1 + X2 - molto meno codice da mantenere e altrettanto efficiente (in realtà è di più efficiente perché ti sbarazzi del sovraccarico del trigger).

Un'altra opzione (più esotica) è utilizzare l'estensione orientata agli oggetti di Postgres e creare una colonna virtuale:

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;

È quindi possibile utilizzare:

select x.*, x.x3
from x;

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

Questo, tuttavia, ha lo svantaggio di dover esplicitamente seleziona il x3 colonna. Non verrà visualizzato quando si utilizza x.*