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

Requêtes MySQL Discussion :

Requête Insert / Update


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux

    Informations forums :
    Inscription : Avril 2012
    Messages : 111
    Points : 42
    Points
    42
    Par défaut Requête Insert / Update
    Bonjour,
    Depuis un fichier journalier, je reçois diverses informations dont, "root_number" (correspond à un N° de client) et "isin". Le "root_number" est unique "isin", non.
    le même "isin" peu donc être affecté à plusieurs clients.
    les lignes de mon fichier reçu ressemblent à ça:
    root_number| isin
    123456; FR001234
    123456; US001234
    456789; BE001233
    456789; FR001234

    ma table dispose d'une clé, le champ "root_number".

    J'essaie de faire des "insert" puis "update" avec la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $sql = "INSERT INTO basebr (uid, root_number, isin) VALUES (' ', '$IDF2', '$ISIN')
    ON DUPLICATE KEY UPDATE root_number='$IDF2', isin='$ISIN'
    Ce que je chercher à faire:
    1/ Si le couple root_number/isin est déja présent dans la table, je le met à jours.
    2/ Si le couple root_number/isin n'est pas présent dans la table, je le crée.

  2. #2
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    La démarche usuelle serait d'abord de faire un SELECT pour vérifier l'existence du couple de valeur dans la table, auquel cas on fait un insert ou un update dessus. Ceci oblige à transactionner l'opération et des problèmes de verrous peuvent se poser et seront à prendre en compte dans l'opération.

    La méthode que vous avez choisie, certes interessante pose d'autres problèmes contextuelles qui se situent au niveau de vos définition d'index et du choix fonctionnel de votre table.
    Les questions auxquelles il faut des réponses pour résoudre votre problème par rapport à votre choix technique sont les suivantes:

    1) Votre clé primaire porte-t-elle uniquement sur la colonne uid ou est-elle composite sur les 3 colonnes?
    2) Si la réponse à la première est non, avez-vous défini un index unique couvrant sur vos deux colonnes root_number et isin?

    Il faut bien dire que ces questions là ont une réponse sans intérêt malgré leur pertinence car votre table n'est pas une table de jonction : vous utilisez la colonne uid qui reste définie en clé primaire quelque soit le contexte. Or la contrainte ON DUPLICATE KEY ne porte exclusivement QUE sur la clé primaire, et à cause de la colonne uid, ne se déclenchera jamais.

    Cordialement,

    Jc.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux

    Informations forums :
    Inscription : Avril 2012
    Messages : 111
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Merci pour vos pertinents commentaires.

    1) Votre clé primaire porte-t-elle uniquement sur la colonne uid ou est-elle composite sur les 3 colonnes?
    2) Si la réponse à la première est non, avez-vous défini un index unique couvrant sur vos deux colonnes root_number et isin?
    1/ ma clé porte uniquement sur la colonne 'uid'
    2/ mon index unique porte uniquement la colonne 'root_number'

    Apparament je ne me suis pas engagé sur la bonne voie avec 'ON DUPLICATE KEY' pourtant cette condition me parraissait pratique à utiliser.

    Cordialement.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il y a un paradoxe entre votre besoin et ce que vous avez :
    Ce que je chercher à faire:
    1/ Si le couple root_number/isin est déja présent dans la table, je le met à jours.
    2/ Si le couple root_number/isin n'est pas présent dans la table, je le crée.
    ---
    2/ mon index unique porte uniquement la colonne 'root_number'
    Il ne peut y avoir deux fois la même valeur pour root_number donc il ne peut y avoir deux couples contenant le même root_number !

    Si votre table est une table associative entre les root et les isin, vous n'avez pas besoin de uid. Supprimez cette colonne et faites du couple {root_number, isin} votre clé primaire. Vous aurez alors plus de chances que ON DUPLICATE KEY UPDATE fonctionne. À tester quand même car je ne sais pas si ça peut réagir sur plus d'une colonne.

    Sinon il faudra faire un TRIGGER BEFORE INSERT pour tester l'existence du couple et l'insérer ou le mettre à jour.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux

    Informations forums :
    Inscription : Avril 2012
    Messages : 111
    Points : 42
    Points
    42
    Par défaut
    Lors de ta dernière réponse nous avions adopté un tutoiement CinePhil je me permet dons de reprendre celui-ci.

    Je viens de faire les tests suivants et apparament 'ON DUPLICATE KEY' ne fonctionne pas avec une clé affectée sur deux champs. A moins que le problème soit dans ma table ou ma requête. Les voici

    ma table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS `basebr` (
      `root_number` varchar(10) NOT NULL,
      `isin` varchar(25) NOT NULL,
      KEY `isin` (`isin`),
      KEY `root_number` (`root_number`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = "INSERT INTO basebr (root_number, isin)
    VALUES ('$IDF2', '$ISIN')
    ON DUPLICATE KEY UPDATE
    root_number='$IDF2', isin='$ISIN''
    ";
    Avec cette confiuration, les champs sont ajoutés sans contrôle à chaque execution du script...

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Loupita Voir le message
    Lors de ta dernière réponse nous avions adopté un tutoiement CinePhil
    Je réponds à tellement de monde que je ne peux pas me souvenir de tous.

    je me permet dons de reprendre celui-ci.
    No problem.

    Je viens de faire les tests suivants et apparament 'ON DUPLICATE KEY' ne fonctionne pas avec une clé affectée sur deux champs. A moins que le problème soit dans ma table ou ma requête. Les voici

    ma table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS `basebr` (
      `root_number` varchar(10) NOT NULL,
      `isin` varchar(25) NOT NULL,
      KEY `isin` (`isin`),
      KEY `root_number` (`root_number`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = "INSERT INTO basebr (root_number, isin)
    VALUES ('$IDF2', '$ISIN')
    ON DUPLICATE KEY UPDATE
    root_number='$IDF2', isin='$ISIN''
    ";
    Avec cette confiuration, les champs sont ajoutés sans contrôle à chaque execution du script...
    Effectivement, le problème vient de ta table.

    J'avais dit ceci :
    Citation Envoyé par CinéPhil
    faites du couple {root_number, isin} votre clé primaire.
    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE IF NOT EXISTS `basebr` (
      `root_number` varchar(10) NOT NULL,
      `isin` varchar(25) NOT NULL,
      PRIMARY KEY (`isin`, `root_number`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux

    Informations forums :
    Inscription : Avril 2012
    Messages : 111
    Points : 42
    Points
    42
    Par défaut
    C'est OK, après modification de ma table, les insertions et update fonctionnent au moins avec mes deux fichiers de test (+/- 2000 lignes)

    Je clôture le post mais viendrai faire un commentaire dès la fin de mes tests.

    Merci à tous.

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

Discussions similaires

  1. [C#]Requêtes INSERT / UPDATE
    Par bart64 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 10/02/2008, 19h48
  2. requéte insert /update/delete par dataAdapter
    Par magui_laurene dans le forum Accès aux données
    Réponses: 1
    Dernier message: 02/08/2007, 14h12
  3. Requête INSERT ou UPDATE avec saut de ligne
    Par CinErarY dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 02/05/2007, 04h38
  4. [ODBC] Faire une requête INSERT, DELETE, UPDATE
    Par avogadro dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/09/2006, 11h35
  5. Réponses: 4
    Dernier message: 05/04/2005, 18h28

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