2009-06-25 11 views
5

J'utilise une table de mémoire . Il a plusieurs identifiants et toutes les données sont des entiers. Mon code met à jour le compteur de 1 si les données existent ou crée une ligne avec compteur = 1 sinon.Mysql Erreur d'entrée en double sur ON DUPLICATE KEY UPDATE

La requête que j'utilise est:

INSERT INTO linked_mem 
     (id1, id2, id31, id4 cnt) 
     VALUES (31316, 0, 557158967, 261470594, 1) 
     ON DUPLICATE KEY UPDATE cnt= cnt+1 

De temps en temps (environ 5% des inserts) Je reçois "entrée en double '[numéros clés]' pour la touche 1

Quel pourrait être le problème Isn? « t la partie KEY UPDATE Duplicate censé gérer la clé en double

Mise à jour: créer la table de ajoutant la table réelle

CREATE TABLE `linked_mem` (
    `li_sid` int(10) unsigned NOT NULL default '0', 
    `li_id1` int(10) unsigned NOT NULL default '0', 
    `li_cid1` int(10) unsigned NOT NULL default '0', 
    `li_id2` int(10) unsigned NOT NULL default '0', 
    `li_cid2` int(10) unsigned NOT NULL default '0', 
    `cnt` int(10) unsigned NOT NULL default '1', 
    `li_filter` int(10) unsigned NOT NULL default '0', 
    `li_group` int(10) unsigned NOT NULL default '0', 
    PRIMARY KEY (`li_id1`,`li_sid`,`li_cid1`,`li_cid2`,`li_group`,`cnt`,`li_id2`) 
) ENGINE=MEMORY DEFAULT CHARSET=latin1 
+0

pouvez-vous télécharger la table create de linked_mem –

Répondre

10

Cela peut se produire si vous mettez à jour un champ marqué UNIQUE et que la deuxième violation de clé se produit sur UPDATE.

Mise à jour:

A partir de la structure de votre table, je peux voir que c'est exactement votre cas.

C'est ce qui se passe:

INSERT INTO linked_mem 
     (id1, id2, id31, id4 cnt) 
     VALUES (31316, 0, 557158967, 261470594, 1) 

-- inserts 

INSERT INTO linked_mem 
     (id1, id2, id31, id4 cnt) 
     VALUES (31316, 0, 557158967, 261470594, 1) 

-- updates `cnt` to 2 

INSERT INTO linked_mem 
     (id1, id2, id31, id4 cnt) 
     VALUES (31316, 0, 557158967, 261470594, 1) 

-- tries again to update `cnt` to 2 and fails 

Supprimer cnt de votre PRIMARY KEY définition.

1

cnt est dans la clé primaire, c'est peut-être ce qui provoque l'erreur/incapacité de le mettre à jour.

1

Etes-vous sûr que la clé primaire est correcte? L'utilisation de cette clé primaire identifie également une ligne par la valeur de cnt, qui est censée être un compteur.

Je n'ai pas testé cela, mais je pense que la requête suivante donnera l'erreur si vous démarrez avec une table vide.

INSERT INTO linked_mem 
    (id1, id2, id31, id4, cnt) 
VALUES 
    (1, 1, 1, 1, 1),     // (1, 1, 1, 1, 1) added 
    (1, 1, 1, 1, 1),     // (1, 1, 1, 1, 1) -> (1, 1, 1, 1, 2) 
    (1, 1, 1, 1, 1),     // (1, 1, 1, 1, 1) added (now two rows) 
    (1, 1, 1, 1, 1)     // error 
ON DUPLICATE KEY UPDATE cnt = cnt+1 

à la quatrième ligne, le (1, 1, 1, 1, 1) serait mis à jour à (1, 1, 1, 1, 2), mais cela existe déjà.

0

Il est difficile de dire avec vos noms de colonnes non informatifs, mais cette clé primaire est si large qu'elle semble inutile. Que fait-il réellement, et pourquoi cet ensemble de colonnes a-t-il été choisi? Y a-t-il un meilleur choix? Je suppose que les autres affiches ont raison, et votre mise à jour est en train de violer la contrainte d'unicité implicite du PK; avec le compte étant l'une de vos colonnes PK, c'est à prévoir.

0

J'ai eu le même problème.

En utilisant Duplicate KEY UPDATE et ayant toujours l'erreur: entrée en double

Il a été causé par une autre colonne ayant un index de clé unique et une ligne ayant une valeur vide en elle.

Questions connexes