Writing A On Insert Trigger In Postgresql

Here is a simple example of a on insert postgresql trigger.

I have a table called what_did_you_eat. It has the following structure -

column namedatatype
what_did_you_eat_idserial
whattext

what will contain what was eaten.

I have another table called what_was_the_type with the following structure -

column namedatatype
what_was_the_type_idserial
what_did_you_eat_idint
what_typetext

I want to store the type of food that was eaten in what_type column. And I want to do this to happen on insert into the what_did_you_eat table.

So, off we go to write a trigger. Postgresql trigger consists of two parts -

  • A trigger
  • And a trigger function: Basically a function that is called when trigger is called.

We first write the trigger function.

CREATE OR REPLACE FUNCTION public.trgfunc_populate_the_type()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
	DECLARE _type text;
    BEGIN
    
        -- we try to find out if a fruit or a vegetable was eaten
        -- NEW is the row that was inserted
        IF (NEW.what = 'apple' or NEW.what = 'orange') THEN
            _type = 'fruit';
        ELSEIF (NEW.what = 'potato' or NEW.what = 'carrot') THEN
            _type = 'vegetable';
        ELSE
            -- if we can't determine the type of food, we mark it
            -- as unkown
            _type = 'unknown';
        END IF;
        -- we now insert the food type
        INSERT INTO what_was_the_type (what_did_you_eat_id, what_type)
        SELECT NEW.what_did_you_eat_id, _type;
    
        RETURN NULL;
    END;
$BODY$;

Now the trigger.

CREATE TRIGGER trg_populate_type
    -- for this example, we are interested only in INSERTions
    AFTER INSERT
    ON public.what_did_you_eat
    -- for every row inserted
    -- we want to execute the trigger function
    FOR EACH ROW
    EXECUTE PROCEDURE public.trgfunc_populate_the_type();

The results.

On running

INSERT INTO what_did_you_eat(what) VALUES ('apple');
INSERT INTO what_did_you_eat(what) VALUES ('ice cream');

we get the following in the what_did_you_eat table

what_did_you_eat_id what
1 apple
2 ice cream

and in the what_was_the_type table -

what_was_the_type_id what_did_you_eat_id what_type
1 1 fruit
2 2 unknown

Other postgresql articles