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:
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
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) );
La colonne enfant_id est auto-incrémentée à partir de 1 pour chaque parent_id.
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
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';Je n'ai pas d'erreur de syntaxe et le code me semble bon.
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();
Mais lorsque j'écris un ordre INSERT comme ceci:
J'obtiens l'erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 insert into t_enfant(parent_id, nom) values (3, 'e1');
Voilà, si quelqu'un trouve la source d'erreur, ou veux bien m'aider avec ce trigger, ça serait sympa.
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
Merci,
Bonne journée.
Partager