Bonjour,

Je débute avec PostgreSQL (v8.4) et j'essaie de créer un trigger qui va m'aider à gérer l'identification relative d'une table enfant par rapport à sa table parent.

Les deux tables pour le test:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
create table t_parent (
	id serial,
	nom varchar(30),
	CONSTRAINT pk_parent PRIMARY KEY(id)
);
insert into t_parent(nom) values ('n1');
insert into t_parent(nom) values ('n2');
insert into t_parent(nom) values ('n3');
insert into t_parent(nom) values ('n4');
 
create table t_enfant (
	parent_id serial,
	enfant_id integer,
	nom varchar(40),
	CONSTRAINT pk_enfant PRIMARY KEY (parent_id, enfant_id),
	CONSTRAINT fk_enfant_parent FOREIGN KEY (parent_id) REFERENCES t_parent(id)
);
L'objetif dans la table enfant est d'obtenir ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
parent_id  enfant_id  nom
-----------------------------
     2         1      e1
     2         2      e2
     2         3      e3
     3         1      e4
     3         2      e5
     4         1      e6
     4         2      e7
La colonne enfant_id est auto-incrémentée à partir de 1 pour chaque parent_id.

Donc je doit alimenter cette colonne dans un Trigger Before Insert.

Voilà la fonction que j'ai écrite et son trigger :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE OR REPLACE FUNCTION f_indentification_relative_enfant () RETURNS trigger AS '
	DECLARE
		idEnfant integer;
	BEGIN
		SELECT INTO idEnfant MAX(enfant_id)
		FROM t_enfant
		WHERE parent_id = NEW.parent_id;
 
		IF NOT FOUND THEN
	    	idEnfant := 1;
	    ELSE
	    	idEnfant := idEnfant +1;
	    END IF;
 
	   NEW.enfant_id := idEnfant;
 
    RETURN NEW;
  END;
' LANGUAGE 'plpgsql';
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
CREATE TRIGGER t_ident_rel_enfant
    BEFORE INSERT ON t_enfant FOR EACH ROW
    EXECUTE PROCEDURE f_indentification_relative_enfant();
Je n'ai pas d'erreur de syntaxe et le code me semble bon.
Mais lorsque j'écris un ordre INSERT comme ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
insert into t_enfant(parent_id, nom) values (3, 'e1');
J'obtiens l'erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
********** Error **********
 
ERROR: null value in column "enfant_id" violates not-null constraint
SQL state: 23502
Voilà, si quelqu'un trouve la source d'erreur, ou veux bien m'aider avec ce trigger, ça serait sympa.

Merci,
Bonne journée.