THE ORB
Studio wird gestartet

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.

groupsSpeichern schlägt für diesen Spieler fehlcodeBraucht einen Entwickler

Mach das zuerst

Wenn es bei jedem Join passiert, fügt das Script ein, ohne vorher zu prüfen. Meld es dem Autor.

bug_reportFüg lieber deine ganze Konsole ein

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. 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. 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. 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. 4

    Zwei Server auf einer Datenbank

    Eine Entwicklungs- und eine Live-Maschine mit denselben Zugangsdaten.

  5. 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 öffnen

Für diese Art Fehler Script Optimizer erkennt die Abfragemuster, die das verursachen.

Fehler, die mit diesem zusammen auftreten