Entrée en double « <valeur> » pour la clé « <index> »
Un script a tenté d'enregistrer quelque chose qui existe déjà, en général un joueur ajouté deux fois.
Faites d'abord ceci
Si cela arrive à chaque connexion, le script insère sans vérifier avant. Signalez-le à l'auteur.
Ce que ça veut dire
Un INSERT a tenté d'écrire une valeur qu'une clé UNIQUE ou PRIMARY possède déjà. MySQL a refusé toute l'instruction. Le message nomme la valeur et l'index en conflit, et à eux deux ils identifient la ligne.
Ce qui la provoque
Classé par fréquence : la cause la plus probable en premier.
- 1
Insérer un joueur qui existe déjà
Un gestionnaire
playerConnectingou de première connexion qui insère sans condition. Deuxième connexion, même identifiant, collision. - 2
Un gestionnaire enregistré deux fois
Le même événement lié dans deux fichiers, ou une ressource redémarrée sans que son gestionnaire soit nettoyé, donc chaque action s'exécute deux fois.
- 3
Une nouvelle tentative après un délai dépassé qui avait en fait réussi
Le premier insert a fonctionné et la réponse s'est perdue ; la relance entre en collision.
- 4
Deux serveurs sur une seule base de données
Une machine de dev et une de production partageant les identifiants.
- 5
Un identifiant généré côté client
Tout ce que le client fournit comme clé primaire finira par se répéter.
Comment savoir laquelle est la vôtre
Cherchez la ligne déjà présente :
SELECT * FROM users WHERE identifier = 'la-valeur-du-message';
Si cela ressemble à un joueur légitime déjà existant, l'insert n'aurait jamais dû s'exécuter. Si c'est un doublon d'une ligne créée il y a quelques secondes, vous insérez deux fois.
Où regarder
L'INSERT dans la ressource, et si quelque chose vérifie l'existence au préalable.
Comment la corriger
Dites ce qui doit se passer en cas de collision plutôt que de laisser l'erreur survenir :
-- garder la ligne existante, ne rien faire INSERT IGNORE INTO users (identifier, name) VALUES (?, ?) -- ou la mettre à jour INSERT INTO users (identifier, name) VALUES (?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name)
Toujours bloqué sur votre propre code ?
Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.
bug_reportOuvrir le Server FixerPour ce type d'erreur, le Script Optimizer repère les motifs de requête à l'origine de ceci.