Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
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 27/02/2007, 16h46   #1
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Par défaut Insert .. where not exists

J'ai un cas un peu particulier.

Je travaille avec 2 tables.
La 1ère contient les données suivantes :
Commande / Client / Date chargement / heure de chargement / ...
Je peux avoir plusieurs lignes contenant le même client/date/heure, mais le n° de commande est toujours différents.

Ma seconde table doit reprendre :
Client / Date chargement / heure de chargement /
Mais je ne peux avoir qu'une seule ligne par date/heure/client.

J'ai donc un formulaire qui me permets d'encoder l'heure de chargement en fonction de la commande dans la 1ère table et, en même temps, lors de sa validation, une ligne doit être ajoutée dans la seconde table, sauf si celle-ci existe déjà.

Je pensais utiliser la fonction WHERE NOT EXISTS, mais elle ne semble pas fonctionner (ou alors, j'ai fait une erreur de syntaxe).

Est-ce que qqun peut m'aider à résoudre mon problème ?

Merci d'avance.
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 21h53   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
tu mets une clé unique sur la seconde table, et elle refusera les insertions d'elle-même.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2007, 11h45   #3
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Merci pour la réponse

J'ai mis une clé unique sur l'ID de cette table et ça ne fonctionne pas.

Une autre idée.
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2007, 12h39   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Qu'est-ce que tu fais, quel message d'erreur obtiens-tu ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2007, 13h37   #5
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Je n'ai aucun messsage d'erreur, les lignes sont dupliquées sans problème.
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2007, 14h11   #6
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
OK. Peux-tu me donner la requête de création de ta clé unique (ou le SHOW CREATE TABLE de ta seconde table), ainsi que ta requête d'insertion ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2007, 14h25   #7
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Tout d'abord, merci pour ton aide.

En fait, j'utilise PhPmyAdmin pour gérer ma table, je crée donc ma clé unique avec ça.
Il exécute la commande
Code :
1
2
3
ALTER TABLE `exportation` ADD UNIQUE (
`export_id`
)
En fait, pour mon insert, j'ai 2 fonctions, la 1ère qui effectue la màj des données de la 1ère table
Code :
1
2
$query="UPDATE delivery SET load_date = '$loadDate', load_time = '$loadTime', truck_type = '$truck', note = '$note' WHERE delivery_id='$id';";
      mysql_query($query);
et la seconde qui ajoute une ligne par livraison
Code :
1
2
$queryExp='INSERT INTO exportation (date, time, customer1_id, truck_type) VALUES ("'.$loadDate.'","'.$loadTime.'","'.$customer.'","'.$truck.'");' OR die(mysql_error());
      mysql_query($queryExp);
Cependant, lorsque j'effectue d'autre modification sur la 1ère table, des lignes sont ajoutées dans la 2ème table, alors qu'il devrait y avoir un contrôle.

J'espère que ces données pourront t'aider.
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2007, 14h28   #8
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Il faut que tu mettes la clé unique sur la combinaison date/heure/client. Sur la clé primaire, ça ne sert à rien.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2007, 14h48   #9
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Génial, ça fonctionne parfaitement dans ce cas de figure.
Merci beaucoup pour ton aide.

Cependant, il me reste un petit détail à régler.

Il faut également que je tienne compte du fait que les champs "date" et "heure" peuvent être modifié.
Ce qui signifie que, dans l'état actuel des choses, il me fait toujours un INSERT et je me retrouve donc avec une nouvelle ligne.
Maintenant, est-ce que je peux me servir de cette clé unique pour effectuer un contrôle dans ma requête et, ainsi, passer un UPDATE sur l'id retourné ?

Pour info, "sql's nOOb" inside
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2007, 16h58   #10
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
oui, avec la syntaxe INSERT INTO... ON DUPLICATE KEY UPDATE.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2007, 10h06   #11
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Merci pour ta réponse.

Ca ne fonctionne pas.

Je pense que c'est du au fait que les champs qui peuvent être modifiés font partie de la clé unique, non ?
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2007, 11h26   #12
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
J'ai trouvé la solution.

J'enregistre l'id de la 1ère table dans la seconde et je la définis comme clé unique.
Vu que celle-ci ne change jamais, ça fonctionne parfaitement.

Un grand merci pour ton coup de main et surtout pour le "ON DUPLICATE KEY UPDATE". Je ne connaissais pas, mais je vais devoir m'en resservir qques fois dans mon programme.
Zolex 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 18h29.


 
 
 
 
Partenaires

Hébergement Web