Doppelter Eintrag '<Wert>' für den Schlüssel '<Index>'
Ein Script wollte etwas speichern, das es schon gibt — meist ein Spieler, der zweimal angelegt wird.
Mach das zuerst
Wenn es bei jedem Join passiert, fügt das Script ein, ohne vorher zu prüfen. Meld es dem Autor.
Was es bedeutet
Ein INSERT wollte einen Wert schreiben, den ein UNIQUE- oder PRIMARY-Schlüssel schon hat. MySQL hat die ganze Anweisung abgelehnt. Die Meldung nennt Wert und kollidierenden Index — zusammen identifizieren sie die Zeile.
Was es auslöst
Sortiert danach, wie oft es die Antwort ist.
- 1
Einen Spieler einfügen, den es schon gibt
Ein
playerConnecting- oder Erst-Beitritts-Handler, der bedingungslos einfügt. Zweiter Beitritt, dieselbe Kennung, Kollision. - 2
Ein Handler, der doppelt registriert ist
Dasselbe Event in zwei Dateien gebunden, oder eine Resource neu gestartet, ohne dass ihr Handler aufgeräumt wurde — also läuft jede Aktion doppelt.
- 3
Ein Wiederholungsversuch nach einer Zeitüberschreitung, die eigentlich geklappt hat
Das erste Insert hat funktioniert und die Antwort ging verloren; der zweite Versuch kollidiert.
- 4
Zwei Server auf einer Datenbank
Eine Entwicklungs- und eine Live-Maschine mit denselben Zugangsdaten.
- 5
Eine client-seitig erzeugte Id
Alles, was der Client als Primärschlüssel liefert, wiederholt sich irgendwann.
Wie du erkennst, welcher deiner ist
Such die Zeile, die schon da ist:
SELECT * FROM users WHERE identifier = 'der-wert-aus-der-meldung';
Sieht sie nach einem echten, schon vorhandenen Spieler aus, hätte das Insert gar nicht laufen dürfen. Ist sie ein Duplikat einer Zeile von vor Sekunden, fügst du doppelt ein.
Wo du nachsehen musst
Das INSERT in der Resource und ob vorher überhaupt auf Existenz geprüft wird.
Wie du es behebst
Sag, was bei einer Kollision passieren soll, statt es auf einen Fehler ankommen zu lassen:
-- vorhandene Zeile behalten, nichts tun INSERT IGNORE INTO users (identifier, name) VALUES (?, ?) -- oder sie aktualisieren INSERT INTO users (identifier, name) VALUES (?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name)
Hängst du immer noch an deinem eigenen Code?
Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.
bug_reportServer Fixer öffnenFür diese Art Fehler Script Optimizer erkennt die Abfragemuster, die das verursachen.