Entrada duplicada '<valor>' para a chave '<índice>'
Um script tentou salvar algo que já existe, normalmente um jogador sendo adicionado duas vezes.
Faça isto primeiro
Se acontece em toda entrada, o script insere sem conferir antes. Reporte para o autor.
O que significa
Um INSERT tentou escrever um valor que uma chave UNIQUE ou PRIMARY já tem. O MySQL recusou a instrução inteira. A mensagem nomeia o valor e o índice com o qual colidiu, e juntos eles identificam a linha.
O que causa isso
Ordenado pela frequência com que é a resposta.
- 1
Inserir um jogador que já existe
Um handler de
playerConnectingou de primeira entrada que insere sem condição. Segunda entrada, mesmo identificador, colisão. - 2
Um handler registrado duas vezes
O mesmo evento amarrado em dois arquivos, ou um resource reiniciado sem que o handler dele fosse limpo, então cada ação roda duas vezes.
- 3
Uma nova tentativa depois de um timeout que na verdade deu certo
O primeiro insert funcionou e a resposta se perdeu; a nova tentativa colide.
- 4
Dois servidores em um único banco de dados
Uma máquina de desenvolvimento e uma no ar compartilhando credenciais.
- 5
Um id gerado do lado do cliente
Qualquer coisa que o cliente forneça como chave primária vai se repetir mais cedo ou mais tarde.
Como saber qual é o seu
Procure a linha que já está lá:
SELECT * FROM users WHERE identifier = 'o-valor-da-mensagem';
Se parece um jogador legítimo que já existia, o insert nem deveria ter rodado. Se é uma duplicata de uma linha criada há segundos, você está inserindo duas vezes.
Onde olhar
O INSERT do resource, e se alguma coisa checa antes se já existe.
Como consertar
Diga o que deveria acontecer numa colisão em vez de deixar dar erro:
-- manter a linha que já está, não fazer nada INSERT IGNORE INTO users (identifier, name) VALUES (?, ?) -- ou atualizar ela INSERT INTO users (identifier, name) VALUES (?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name)
Ainda travado no seu próprio código?
Esta página é o que esse erro costuma significar. Cole o seu console no Server Fixer e ele vai ordenar tudo o que estiver lá e te dizer o que fazer primeiro; e se você preferir não mexer, o ORBIE consegue consertar o script e te devolver o resource pronto para soltar.
bug_reportAbrir o Server FixerPara esse tipo de erro, o Script Optimizer detecta os padrões de consulta que causam isso.