Triggers for a MPTT based table - Mailing list pgsql-general

From Laurent Rahuel
Subject Triggers for a MPTT based table
Date
Msg-id 49D222C7.1090202@net-ng.com
Whole thread Raw
List pgsql-general
Hi all,

I wish to use a MPTT based table to store some hierachical datas. Here
is my table definition:

CREATE TABLE region (
        id SERIAL NOT NULL,
        full_path VARCHAR(255) NOT NULL,
        lhs INTEGER NOT NULL,
        rhs INTEGER NOT NULL,
        level INTEGER NOT NULL,
        parent_id INTEGER,
        PRIMARY KEY (id),
         FOREIGN KEY(parent_id) REFERENCES region (id) ON DELETE cascade
)

I'm trying to manage lhs, rhs and level with triggers.

Here are my triggers:


CREATE OR REPLACE FUNCTION  update_tree_oninsert() RETURNS TRIGGER AS $BODY$
BEGIN
    IF NEW.parent_id != 0 THEN
        UPDATE region SET level = (select level from region where id =
NEW.parent_id)+1 where id = NEW.id;
        UPDATE region SET lhs = (select rhs from region where id =
NEW.parent_id) where id = NEW.id;
        UPDATE region SET rhs = lhs + 1 where id = NEW.id;
        UPDATE region SET rhs = rhs + 2 WHERE rhs >= (select rhs from
region where id = NEW.parent_id) and id != NEW.id;
        UPDATE region SET lhs = lhs + 2 WHERE lhs >= (select rhs from
region where id = NEW.id) and id != NEW.id;
    END IF;
    RETURN NEW ;
END ;
 $BODY$
 LANGUAGE 'plpgsql' ;

CREATE TRIGGER  add_upd
     AFTER INSERT ON  region
     FOR EACH ROW EXECUTE PROCEDURE  update_tree_oninsert();



CREATE OR REPLACE FUNCTION  update_tree_ondelete() RETURNS TRIGGER AS $BODY$
BEGIN
    UPDATE region SET lhs = lhs - (OLD.rhs-OLD.lhs+1) WHERE lhs > OLD.rhs;
    UPDATE region SET rhs = rhs - (OLD.rhs-OLD.lhs+1) WHERE rhs > OLD.rhs;
    RETURN OLD ;
END ;
 $BODY$
 LANGUAGE 'plpgsql' ;

CREATE TRIGGER  del_upd
     AFTER DELETE ON  region
     FOR EACH ROW EXECUTE PROCEDURE  update_tree_ondelete();




So here is my problem:

When I insert data in the table region, the trigger on insert is OK but
as soon as I try to remove an entry from the database

For example:

 id |                full_path                | lhs | rhs | level |
parent_id
----+-----------------------------------------+-----+-----+-------+-----------
  1 | world                                   |   1 |  70 |     0 |
  2 | world/continent0                        |   2 |  67 |     1
|         1
  3 | world/continent0/country0               |   3 |  34 |     2
|         2
  4 | world/continent0/country0/region0       |   4 |  13 |     3
|         3
  5 | world/continent0/country0/region0/city0 |   5 |   6 |     4
|         4
  6 | world/continent0/country0/region0/city1 |   7 |   8 |     4
|         4
  7 | world/continent0/country0/region0/city2 |   9 |  10 |     4
|         4
  8 | world/continent0/country0/region0/city3 |  11 |  12 |     4
|         4
  9 | world/continent0/country0/region1       |  14 |  23 |     3
|         3
 10 | world/continent0/country0/region1/city0 |  15 |  16 |     4
|         9
 11 | world/continent0/country0/region1/city1 |  17 |  18 |     4
|         9
 12 | world/continent0/country0/region1/city2 |  19 |  20 |     4
|         9
 13 | world/continent0/country0/region1/city3 |  21 |  22 |     4
|         9
 14 | world/continent0/country0/region2       |  24 |  33 |     3
|         3
 15 | world/continent0/country0/region2/city0 |  25 |  26 |     4
|        14
 16 | world/continent0/country0/region2/city1 |  27 |  28 |     4
|        14
 17 | world/continent0/country0/region2/city2 |  29 |  30 |     4
|        14
 18 | world/continent0/country0/region2/city3 |  31 |  32 |     4
|        14
 19 | world/continent0/country1               |  35 |  66 |     2
|         2
 20 | world/continent0/country1/region0       |  36 |  45 |     3
|        19
 21 | world/continent0/country1/region0/city0 |  37 |  38 |     4
|        20
 22 | world/continent0/country1/region0/city1 |  39 |  40 |     4
|        20
 23 | world/continent0/country1/region0/city2 |  41 |  42 |     4
|        20
 24 | world/continent0/country1/region0/city3 |  43 |  44 |     4
|        20
 25 | world/continent0/country1/region1       |  46 |  55 |     3
|        19
 26 | world/continent0/country1/region1/city0 |  47 |  48 |     4
|        25
 27 | world/continent0/country1/region1/city1 |  49 |  50 |     4
|        25
 28 | world/continent0/country1/region1/city2 |  51 |  52 |     4
|        25
 29 | world/continent0/country1/region1/city3 |  53 |  54 |     4
|        25
 30 | world/continent0/country1/region2       |  56 |  65 |     3
|        19
 31 | world/continent0/country1/region2/city0 |  57 |  58 |     4
|        30
 32 | world/continent0/country1/region2/city1 |  59 |  60 |     4
|        30
 33 | world/continent0/country1/region2/city2 |  61 |  62 |     4
|        30
 34 | world/continent0/country1/region2/city3 |  63 |  64 |     4
|        30
 35 | world/continent_otot                    |  68 |  69 |     1
|         1

But as soon I'm trying to delete an entry I get this error about
constraint being violated:

Does anybody have any clue ?


--
Laurent RAHUEL,
Chef de Projet
______________________________________________________________________
net-ng
14 rue Patis Tatelin, Bât G        Web : http://www.net-ng.com
35700 RENNES                       e-mail: laurent.rahuel@net-ng.com
FRANCE                             Tel : 02.23.21.21.50
_______________________________________________________________________
Ce message et tout document joint sont confidentiels. Toute diffusion
ou publication en est interdite. Si vous recevez ce message par erreur,
merci d'en avertir immédiatement l'expéditeur par e-mail et de
supprimer ce message et tout document joint.
_______________________________________________________________________
This message and any attachment are confidential. Any use is prohibited
except formal approval. If you receive this message in error, please
notify the sender by return e-mail and delete this message and any
attachment from your system.
_______________________________________________________________________



pgsql-general by date:

Previous
From: justin
Date:
Subject: Re: string_to_array with empty input
Next
From: Greg Smith
Date:
Subject: Re: Server Performance