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 :

Problème d'update avec une table qui a une clé primaire un VARCHAR et un TIMESTAMP


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Points : 48
    Points
    48
    Par défaut [RESOLU] Problème d'update avec une table qui a une clé primaire un VARCHAR et un TIMESTAMP
    Bonjour à tous,

    J'ai une table en InnoDB qui comporte en clé primaire un VARCHAR et un TIMESTAMP et j'ai actuellement des données dans cette table. Cette table comporte un champ delta qui est un VARCHAR.

    Or je veux que toutes mes données aient un delta égal à 0. J'ai donc tapé la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE `Points` SET `delta`= '0';
    Mais j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Duplicate entry '50900-2010-03-10' for key 'PRIMARY'
    Voici le code de ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    CREATE  TABLE IF NOT EXISTS `Points` (
      `numLicence` INT NOT NULL ,
      `resultDate` TIMESTAMP NOT NULL ,
      `points` VARCHAR(7) NULL ,
      `delta` VARCHAR(8) NOT NULL ,
      `season` INT NOT NULL ,
      `isOfficial` TINYINT(1) NOT NULL ,
      PRIMARY KEY (`numLicence`, `resultDate`) ,
      INDEX `fk_Points_1` (`numLicence` ASC) ,
      INDEX `fk_Points_2` (`season` ASC) ,
      CONSTRAINT `fk_Points_1`
        FOREIGN KEY (`numLicence` )
        REFERENCES `Players` (`numLicence` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_Points_2`
        FOREIGN KEY (`season` )
        REFERENCES `Seasons` (`id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8;
    et je comprend pas pourquoi. Quelqu'un a une idée ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    pourrais-tu faire un petit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW TRIGGERS FROM points ;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Points : 48
    Points
    48
    Par défaut
    J'ai essayé ta commande, elle ne marche pas et j'ai donc remplacé par le nom de la base de données.
    Et j'ai aucun résultat. Ce qui est normal car j'ai pas de triggers.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    pouvons nous avoir la structure de ta table ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Points : 48
    Points
    48
    Par défaut
    La structure est dans mon premier message.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Points : 394
    Points
    394
    Par défaut
    Essaie cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE `Points` SET `delta`= '0', `resultDate`=`resultDate`;
    Je t'expliquerai le pourquoi du comment après

    Rachid A.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Points : 48
    Points
    48
    Par défaut
    Merci beaucoup Rachid, ça fonctionne en effet.

    Peux-tu m'expliquer le pourquoi du comment ?

    merci d'avance.

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par mydb_server Voir le message
    Essaie cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE `Points` SET `delta`= '0', `resultDate`=`resultDate`;
    Je t'expliquerai le pourquoi du comment après

    Rachid A.
    Bien vu !
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Points : 394
    Points
    394
    Par défaut
    voilà ce que dit la documentation MySQL :

    Le type TIMESTAMP est prévu pour stocker automatiquement l'heure courante lors d'une commande INSERT ou UPDATE. Si vous avez plusieurs colonnes de type TIMESTAMP, seule la première colonne sera mise à jour automatiquement.

    La modification automatique de la première colonne de type TIMESTAMP survient si l'une des conditions suivantes est remplie :

    * Vous insérez explicitement la valeur NULL dans la colonne.
    * La colonne n'est pas spécifiée explicitement dans la commande INSERT ou LOAD DATA INFILE.
    * La colonne n'est pas spécifiée explicitement dans la commande UPDATE et d'autres colonnes changent de valeurs .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mysql> desc Points;
    +------------+------------+------+-----+-------------------+-----------------------------+
    | Field      | Type       | Null | Key | Default           | Extra                       |
    +------------+------------+------+-----+-------------------+-----------------------------+
    | numLicence | int(11)    | NO   | PRI | NULL              |                             |
    | resultDate | timestamp  | NO   | PRI | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
    | points     | varchar(7) | YES  |     | NULL              |                             |
    | delta      | varchar(8) | NO   |     | NULL              |                             |
    | season     | int(11)    | NO   | MUL | NULL              |                             |
    | isOfficial | tinyint(1) | NO   |     | NULL              |                             |
    +------------+------------+------+-----+-------------------+-----------------------------+
    6 rows in set (0.01 sec)
    Après ton UPDATE, toutes les lignes auront la même valeur dans la colonne `resultDate`, il suffit donc que deux lignes aient la même valeur dans le champ `numLicence` pour que la contrainte clé primaire soit violée.
    CQFD

    Rachid A.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Points : 48
    Points
    48
    Par défaut
    merci pour l'explication, je comprend maintenant.

Discussions similaires

  1. [Mapping] Mapping avec une table qui contient 2 clés primaires
    Par San_mary dans le forum Hibernate
    Réponses: 13
    Dernier message: 08/09/2014, 10h51
  2. Réponses: 1
    Dernier message: 18/07/2007, 11h58
  3. suppression dans une table qui contient une clé etrangère
    Par zana74 dans le forum Décisions SGBD
    Réponses: 13
    Dernier message: 08/08/2006, 10h58
  4. Réponses: 7
    Dernier message: 12/07/2006, 17h34
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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