Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/08/2006, 17h43   #1
Invité régulier
 
Inscription : mai 2005
Messages : 17
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 17
Points : 7
Points : 7
Par défaut Précisions sur les générateurs

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
GnouDream est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 23h28   #2
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
Citation:
La ligne « NEW.laClef = GEN_ID(nom_generateur, 1); », me pose problème. Ce « NEW.laclef », est-ce du code delphi ou SQL ?
PSQL, donc propre à Firebird, pas du tout du Delphi
Citation:
INSERT INTO nom_table(id_table, nom_champs)
VALUES (NEW.id_table, 'valeur_champs') ;
non c'est idiot, tu viens de créer un Trigger pour cela
la bonne syntaxe c'est :
Code :
INSERT INTO nom_table(id_table, nom_champs) VALUES (NULL, 'valeur_champs') ;
ou
Code :
INSERT INTO nom_table(nom_champs) VALUES ('valeur_champs') ;
Citation:
Toujours à la ligne « NEW.laClef = GEN_ID(nom_generateur, 1); », le générateur est bien incrémenté de 1 ?
oui
Citation:
INSERT INTO nom_table(id_table, nom_champs)
VALUES (GEN_ID(nom_generateur, 0), 'valeur_champs') ;
oui et non car dans ce cas si id_table table est ta clé primaire alors tu auras des tentatives d'insertion de doublons
Citation:
Il faut donc créer un trigger pour chaque générateur.
oui si tu veux avoir lesprit tranquile et ne pas t'occuper de ce champs auto incrémenté
Citation:
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') ;
non, cf ci dessus
Code :
INSERT INTO nom_table(nom_champs) VALUES ('valeur_champs') ;
suffit, puisque le trigger va faire son travail
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 08h59   #3
Invité régulier
 
Inscription : mai 2005
Messages : 17
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 17
Points : 7
Points : 7
Merci beaucoup , Mr Makowski toujours préssent pour les "Firebirdeurs".
GnouDream est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h18.


 
 
 
 
Partenaires

Hébergement Web