Bonjours à tous, je sais que mon sujet n'est pas très original, mais j'ai pas encore tout compris même après avoir lu tous ce que j'ai trouvé sur ce site et sur la doc Firebird/Interbase.
J’ai 3 grandes questions qui tournent autour de la méthode permettant de gérer les auto incrément (encore !!) sous Firebird.
Ce que j'ai vu dans divers exemples :
1/On crée le générateur :
CREATE GENERATOR nom_ generateur ;
2/On crée un déclencheur qui avant chaque tentative d’insertion récupère la nouvelle valeur du champ incrémenté :
CREATE TRIGGER nom_trigger FOR nom_table
BEFORE INSERT AS
BEGIN
NEW.laClef = GEN_ID(nom_generateur, 1);
END
Question 1
La ligne « NEW.laClef = GEN_ID(nom_generateur, 1); », me pose problème. Ce « NEW.laclef », est-ce du code delphi ou SQL ?
Si SQL peut on le réutiliser dans une autre requête, par exemple le code d’insertion de mes valeurs dans ma table ?
INSERT INTO nom_table(id_table, nom_champs)
VALUES (NEW.id_table, 'valeur_champs') ;
Question 2
Toujours à la ligne « NEW.laClef = GEN_ID(nom_generateur, 1); », le générateur est bien incrémenté de 1 ?
Si oui, alors peut on insérer des valeur dans la table de cette manière ?
INSERT INTO nom_table(id_table, nom_champs)
VALUES (GEN_ID(nom_generateur, 0), 'valeur_champs') ;
Question 3
Si mon TRIGGER se déclenche dès que je lance mon instruction INSERT, est il possible qu’une autre instruction vienne s’exécuter entre la fin de l’exécution de mon TRIGGER et les insertion de valeur contenues dans l’instruction INSERT ?
Si non, alors le code suivant est il valide est sûr ?
1/Créer un générateur pour chaque clé primaire.
CREATE GENERATOR nom_du_generateur ;
2/Il est vivement conseillé de récupérer la valeur de la clé primaire que l’on veut incrémenter avec un trigger, et ce, avant l’insertion.
CREATE TRIGGER nom_trigger FOR nom_table
BEFORE INSERT AS
BEGIN
laclef= GEN_ID(nom_du_generateur, 1);
END ;
Il faut donc créer un trigger pour chaque générateur.
3/A chaque nouvel enregistrement on incrémente la clé primaire.
INSERT INTO nom_table(id_table, nom_champs)
VALUES (GEN_ID(nom_generateur, 0, 'valeur_champs') ;
Merci énormement![]()
Partager