THE ORB
Uruchamiam studio

Duplicate entry '<wartość>' for key '<indeks>'

Skrypt próbował zapisać coś, co już istnieje — zwykle gracza dodawanego dwa razy.

groupsZapis dla tego gracza się nie udajecodePotrzebny programista

Zrób najpierw to

Jeśli zdarza się przy każdym wejściu, skrypt wstawia bez wcześniejszego sprawdzenia. Zgłoś to autorowi.

bug_reportWklej zamiast tego całą konsolę

Co to znaczy

INSERT próbował zapisać wartość, którą już trzyma klucz UNIQUE albo PRIMARY. MySQL odrzucił całe zapytanie. Komunikat podaje i wartość, i indeks, z którym się zderzyła, a razem wskazują one wiersz.

Co to powoduje

Uszeregowane według tego, jak często są odpowiedzią.

  1. 1

    Wstawianie gracza, który już istnieje

    Handler playerConnecting albo pierwszego wejścia, który wstawia bezwarunkowo. Drugie wejście, ten sam identyfikator, kolizja.

  2. 2

    Handler zarejestrowany dwa razy

    To samo zdarzenie podpięte w dwóch plikach albo zasób zrestartowany bez wyczyszczenia handlera, więc każda akcja wykonuje się dwa razy.

  3. 3

    Ponowienie po przekroczeniu czasu, które faktycznie się udało

    Pierwszy insert zadziałał, a odpowiedź przepadła; ponowienie się zderza.

  4. 4

    Dwa serwery na jednej bazie

    Maszyna deweloperska i produkcyjna dzielące dane logowania.

  5. 5

    Identyfikator generowany po stronie klienta

    Cokolwiek, co klient podaje jako klucz główny, w końcu się powtórzy.

Jak poznać, który jest twój

Znajdź wiersz, który już tam jest:

SELECT * FROM users WHERE identifier = 'wartość-z-komunikatu';

Jeśli wygląda na prawidłowego, istniejącego gracza, insert w ogóle nie powinien był się wykonać. Jeśli to duplikat wiersza utworzonego kilka sekund temu, wstawiasz dwa razy.

Gdzie szukać

INSERT w zasobie i to, czy cokolwiek najpierw sprawdza istnienie.

Jak to naprawić

Powiedz, co ma się stać przy kolizji, zamiast pozwalać jej wywalać błąd:

-- zostaw istniejący wiersz, nie rób nic
INSERT IGNORE INTO users (identifier, name) VALUES (?, ?)

-- albo go zaktualizuj
INSERT INTO users (identifier, name) VALUES (?, ?)
ON DUPLICATE KEY UPDATE name = VALUES(name)

Wciąż utknąłeś na własnym kodzie?

Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.

bug_reportOtwórz Server Fixer

Dla tego rodzaju błędu Script Optimizer wyłapuje wzorce zapytań, które to powodują.

Błędy, które chodzą z tym w parze