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 12/10/2011, 14h14   #1
Invité de passage
 
Inscription : mai 2002
Messages : 22
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 22
Points : 3
Points : 3
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.
gside est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 14h49   #2
Invité de passage
 
Inscription : mai 2002
Messages : 22
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 22
Points : 3
Points : 3
Je contourne le problème avec un trigger BEFORE_INSERT:

Code :
1
2
IF (new.MonChampClé < 0) then
   new.MonChampClé = old.MonChampClé;
mais si quelqu'un a une solution plus propre...

Merci,
g.
gside est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 08h58   #3
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 19h24   #4
Invité de passage
 
Inscription : mai 2002
Messages : 22
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 22
Points : 3
Points : 3
Le test a été effectué avec plusieurs versions du trigger, dont la plus simple était:

Code :
1
2
3
4
5
 
begin
  IF (new.UUID<0) then 
    new.UUID = gen_id(MonGenerateur, 1);
end;
gside est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 09h25   #5
Modérateur
 
Avatar de SergioMaster
 
Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 3 617
Détails du profil
Informations personnelles :
Nom : Serge Girard
Âge : 55
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 3 617
Points : 4 522
Points : 4 522
Il est évident que le problème vient du Trigger !

le trigger 'classique' est plutôt de la forme
Code :
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 .....
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 09h26   #6
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Il en manque un bout

La partie déclaration, notamment quand est ce qu'il ne déclenche.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 10h02   #7
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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é.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 11h16   #8
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 213
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 213
Points : 3 315
Points : 3 315
pourquoi des messsages ont disparus (au moin dans ce fil) ?
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 12h11   #9
Modérateur
 
Avatar de SergioMaster
 
Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 3 617
Détails du profil
Informations personnelles :
Nom : Serge Girard
Âge : 55
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 3 617
Points : 4 522
Points : 4 522
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 )
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 13h21   #10
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 213
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 213
Points : 3 315
Points : 3 315
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 :
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 :
1
2
UPDATE matable SET ChampClé=-1, AutreChamp= :AutreChamp
WHERE ChampCléExterne= ValeurCléExterne
c'est normal
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h42.


 
 
 
 
Partenaires

Hébergement Web