sql >> Database >  >> RDS >> PostgreSQL

Postgres-triggerprocedure bij invoegen met behulp van gegevens in ingevoegde velden om berekende gegevens in een ander veld in te voegen

Creëer de triggerfunctie:

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

Maak de 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

Het bovenstaande is in wezen een uitgeklede versie van het voorbeeld in de handleiding
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE

Het opslaan van dergelijke afgeleide gegevens is echter meestal geen goed idee. U moet gewoon een weergave maken die een kolom X3 retourneert die is gedefinieerd als X1 + X2 - veel minder code om te onderhouden en net zo efficiënt (eigenlijk is het meer efficiënt omdat u de trigger-overhead elimineert).

Een andere (meer exotische) optie is om de objectgeoriënteerde extensie van Postgres te gebruiken en een virtuele kolom te maken:

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;

U kunt dan het volgende gebruiken:

select x.*, x.x3
from x;

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

Dit heeft echter het nadeel dat u expliciet selecteer de x3 kolom. Het wordt niet weergegeven bij gebruik van x.*




  1. Foutcode 1292 Mysql DateTime

  2. Kan MySQL TRIGGER niet maken wanneer ik IS NOT NULL gebruik

  3. Op zoek naar hoofdletterongevoelige MySQL-sortering waarbij een !=ä

  4. Wat veroorzaakt de ontbrekende haakje-fout in SQL?