IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

Précisions sur les générateurs


Sujet :

SQL Firebird

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 17
    Points : 15
    Points
    15
    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

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 715
    Points
    3 715
    Par défaut
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO nom_table(id_table, nom_champs) VALUES (NULL, 'valeur_champs') ;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO nom_table(nom_champs) VALUES ('valeur_champs') ;
    Toujours à la ligne « NEW.laClef = GEN_ID(nom_generateur, 1); », le générateur est bien incrémenté de 1 ?
    oui
    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
    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é
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO nom_table(nom_champs) VALUES ('valeur_champs') ;
    suffit, puisque le trigger va faire son travail

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup , Mr Makowski toujours préssent pour les "Firebirdeurs".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Précision sur les makefile
    Par vinzzzz dans le forum Systèmes de compilation
    Réponses: 6
    Dernier message: 09/05/2006, 20h40
  2. [HTML][USEMAP] Précision sur les zones réactives
    Par cladsam dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 08/02/2006, 08h20
  3. Précisions sur les listes
    Par Virgile59 dans le forum Access
    Réponses: 1
    Dernier message: 07/02/2006, 21h20
  4. Précisions sur les recordset DAO
    Par Igricheff dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2005, 17h16
  5. Précision sur les sauvegarde à chaud
    Par alxkid dans le forum Administration
    Réponses: 2
    Dernier message: 09/08/2004, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo