sql >> Base de Datos >  >> RDS >> PostgreSQL

Procedimiento de activación de Postgres al insertar usando datos en campos insertados para insertar datos calculados en otro campo

Cree la función de activación:

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

Crea el disparador:

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

Lo anterior es esencialmente una versión simplificada del ejemplo del manual
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE

Sin embargo, almacenar datos derivados como ese no suele ser una buena idea. Simplemente debe crear una vista que devuelva una columna X3 que se define como X1 + X2 - mucho menos código para mantener e igual de eficiente (en realidad es más eficiente porque se deshace de la sobrecarga del disparador).

Otra opción (más exótica) es usar la extensión orientada a objetos de Postgres y crear una columna virtual:

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;

A continuación, puede utilizar:

select x.*, x.x3
from x;

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

Sin embargo, esto tiene la desventaja de que necesita explícitamente seleccione el x3 columna. No aparecerá al usar x.*