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 :

Update or insert écrase la valeur de clé primaire


Sujet :

SQL Firebird

  1. #1
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 22
    Par défaut Update or insert écrase la valeur de clé primaire
    Bonjour,

    Je cherche à importer des données dans une table sous firebird 2.5, depuis un ensemble de donnée externe.
    J'utilise update or insert, la recherche dans ma table s'effectue non pas sur la clé primaire mais sur la clé de l'ensemble de donnée externe.
    Les valeurs sont fournies par paramètre.

    La table possède un trigger qui alloue une valeur de clé primaire si la clé primaire fournie est négative. Cette valeur de clé primaire est requise pour l'insertion.

    update or insert into matable(ChampClé, ChampCléExterne, AutreChamp)
    values (-1, :ValeurCléExterne, :AutreChamp)
    matching (ChampCléExterne)

    Ca fonctionne bien lors de l'insertion initiale, mais écrase la valeur de la clé avec la valeur '-1' lors de la seconde exécution.

    Je m'attendais à ce que update or insert n'altère pas la valeur de clé primaire en cas de update (par définition, elle ne peut être modifiée...)
    Comment faites vous pour contourner ce problème?

    J'ai regardé l'instruction merge mais elle se base sur une requête interne, or je dois fournir les valeurs par programme

    Merci,
    g.

  2. #2
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 22
    Par défaut
    Je contourne le problème avec un trigger BEFORE_INSERT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (new.MonChampClé < 0) then
       new.MonChampClé = old.MonChampClé;
    mais si quelqu'un a une solution plus propre...

    Merci,
    g.

  3. #3
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Bonjour,

    Difficile de répondre à votre question, car à mon avis le problème vient de votre trigger :
    Citation Envoyé par gside Voir le message
    La table possède un trigger qui alloue une valeur de clé primaire si la clé primaire fournie est négative. Cette valeur de clé primaire est requise pour l'insertion.
    Pour répondre il nous faudrait le code de ce trigger.

  4. #4
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 22
    Par défaut
    Le test a été effectué avec plusieurs versions du trigger, dont la plus simple était:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    begin
      if (new.UUID<0) then 
        new.UUID = gen_id(MonGenerateur, 1);
    end;

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Il est évident que le problème vient du Trigger !

    le trigger 'classique' est plutôt de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      IF (NEW.NUMID IS NULL) THEN
        NEW.NUMID = GEN_ID(GEN_ID, 1);
    où le test est sur NULL

    Je n'ai pas cherché dans la doc , mais si le comportement du UPDATE OR INSERT est le même que celui du REPLACE de mySQL (frais dans ma mémoire) c'est compréhensible : En fait il y a un processus de suppression puis insertion (dans mySQL).
    Une bonne lecture dans la doc semble nécessaire , si j'ai le temps .....

  6. #6
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Il en manque un bout

    La partie déclaration, notamment quand est ce qu'il ne déclenche.

  7. #7
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Non son trigger est correct, simplement cela dépend du déclenchement.

    S'il le lance sur insert ET sur update (ce que je soupçonne), forcément le trigger update reçois -1 et donc il va régénérer une clé.

  8. #8
    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 : 62
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    pourquoi des messsages ont disparus (au moin dans ce fil) ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    non , grand maitre , aucun message n'a disparu . Même si le tout reste plutôt télégraphique

    Effectivement GSide nous a bien parlé d'un trigger mais effectivement sans nous indiqué si c'était un Trigger BEFORE INSERT ou BEFORE INSERT OR UPDATE ou ..... et comme l'indique Barbibulle tel qu'écrit en post #4 si le trigger est du style BEFORE INSERT OR UPDATE le bug est a chercher du coté de Gside (sans vouloir vexer )

  10. #10
    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 : 62
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    ben ...
    j'avais pour fait une réponse sur ce sujet (à moins qu'il y ait un autre fil très semblable)
    avec la syntaxe pour MERGE
    et un autre qui expliquait que son :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update or insert into matable(ChampClé, ChampCléExterne, AutreChamp)
    values (-1, :ValeurCléExterne, :AutreChamp)
    matching (ChampCléExterne)
    se transforme logiquement en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE matable SET ChampClé=-1, AutreChamp= :AutreChamp
    WHERE ChampCléExterne= ValeurCléExterne
    c'est normal

Discussions similaires

  1. [debutant][code] insert multiple de valeurs
    Par topaze dans le forum Oracle
    Réponses: 9
    Dernier message: 29/11/2005, 15h22
  2. [MySQL] Pb d'insertion d'une valeur de champ select dans une Bdd
    Par Mimisator dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 20/10/2005, 18h51
  3. Réponses: 8
    Dernier message: 22/06/2005, 10h34
  4. Pb UPDATE champ nullable avec la valeur Null
    Par zev dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 01/02/2005, 14h04
  5. Update ou insert avec incrément d'un champ
    Par dany13 dans le forum ASP
    Réponses: 5
    Dernier message: 15/10/2004, 12h53

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