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 :

[MySql 5.5.24 ]Problème Insert Duplicate on key update


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut [MySql 5.5.24 ]Problème Insert Duplicate on key update
    Bonjour,

    J'ai créé une base de données dans laquelle il y a trois tables:

    Joueur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE IF NOT EXISTS `joueur` (
      `email` varchar(255) NOT NULL,
      `prenom` char(30) NOT NULL,
      `nom` char(30) NOT NULL,
      `anniversaire` date NOT NULL,
      `password` varchar(256) DEFAULT NULL,
      PRIMARY KEY (`email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Jeux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE IF NOT EXISTS `jeux` (
      `idjeux` int(11) NOT NULL AUTO_INCREMENT,
      `name` char(30) NOT NULL,
      PRIMARY KEY (`idjeux`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
    Essais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE IF NOT EXISTS `essais` (
      `idessais` int(11) NOT NULL,
      `dateessais` date NOT NULL,
      `email` varchar(128) NOT NULL,
      `score` bigint(4) DEFAULT NULL,
      PRIMARY KEY (`idessais`,`dateessais`),
      KEY `I_FK_tryes_games` (`idessais`),
      KEY `I_FK_tryes_client` (`email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Les contraintes de la table essais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ALTER TABLE `essais`
      ADD CONSTRAINT `essais_ibfk_1` FOREIGN KEY (`email`) REFERENCES `joueur` (`email`),
      ADD CONSTRAINT `essais_ibfk_2` FOREIGN KEY (`idjeux`) REFERENCES `jeux` (`idjeux`);
    J'essaie qu'à chaque connexion d'un joueur, si il est déjà présent dans la table essais, la colonne "datessais" se mette à jour et si le joueur n'est pas présent une nouvelle ligne soit créée.

    J'utilise cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into essais (idjeux, dateessais, email, score) values (2, CURRENT_DATE(), 'maurice.roger@truc.com', NULL) on duplicate key update dateessais values(dateessais);
    La ligne étant déjà existante je me retrouve, non pas avec une ligne avec la date modifiée, mais avec une nouvelle ligne, la requête effectue l'insertion plutôt que la mise à jour.

    Merci pour votre aide.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Alors à mon avis, votre clef primaire pour la table essai devrait être le couple (idJeux - email)

    au passage, email est une mauvaise clef primaire pour la table joueur : comment ferez-vous si un joueur change d'email ?(en plus des pertes de performances liées à la longueur et au type de la colonne)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Alors à mon avis, votre clef primaire pour la table essai devrait être le couple (idJeux - email)
    Effectivement, c'est ainsi que j'aurais dû déclarer mon identifiant sur cette table.

    au passage, email est une mauvaise clef primaire pour la table joueur : comment ferez-vous si un joueur change d'email ?(en plus des pertes de performances liées à la longueur et au type de la colonne)
    C'est un jeu promotionnel qui ne dure qu'un certain temps. L'idée était de récupérer les adresses email des utilisateurs pour une campagne de fidélisation, c'était à mon avis le moyen le plus simple pour les clients de se connecter et pour récupérer des adresses mail.

    Mais je comprends bien les arguments avancés et je pense que ce n'est pas le moyen le plus performant pour gérer la table.

    Merci pour vous informations.

Discussions similaires

  1. Problème Procédure avec On Key Update
    Par smiley95 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 24/04/2008, 01h52
  2. [MySQL] Problème insertion de données dans table Mysql
    Par Malcolm78 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/10/2007, 17h25
  3. [Mysql 3.23.58] Problème avec insert
    Par trihanhcie dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/08/2006, 11h04
  4. Réponses: 1
    Dernier message: 07/08/2006, 10h22

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