Ich habe eine Tabelle mit dem Namen tbl_jobs
, die die Metadaten einiger Hintergrundjobs speichert, die in der Anwendung ausgeführt werden. Das Schema ist wie folgt:
Immer wenn ein Job ausgeführt wird, wird ein Eintrag in der Tabelle mit dem type
erstellt, der eine eindeutige ID für verschiedene Jobs ist, run time
und records updated
in diesem Lauf.
Es gibt zwei verschiedene Jobs, die gleichzeitig mit Typen ausgeführt werden: MAILER_UNLOCKED_REWARDS
und MAILER_ALMOST_UNLOCKED
.
Wenn diese Jobs versuchen, ihre Einträge mit demselben Zeitstempel einzufügen, wird nur einer von ihnen eingefügt und der andere löst einen doppelten Eintrag für Schlüssel aus.
Zum Beispiel liefen die beiden Jobs wie folgt:
%Vor%das erfolgreich ausgeführt wurde, aber wenn der zweite Job den Einfügebefehl
ausgeführt hat %Vor%Es hat den Fehler
ausgelöst %Vor% Der Primärschlüssel besteht aus den Spalten type
und last_run_on
.
Wenn ich den Eintrag für den ersten Job lösche, ist die Einfügung erfolgreich, d. h. es wird verlangt, dass timestamp
allein eindeutig ist.
Der Konflikt für den gleichen timestamp
tritt jedoch nur zwischen diesen beiden Jobs auf. Es gibt andere Jobs, die für dasselbe timestamp
eingefügt werden.
Irgendwelche Ideen, was könnte das Problem sein?
Verwenden Sie das ganze Feld "Typ" in Ihrem Index? Oder nur das erste Zeichen? Weil der Schlüssel, über den sich MySQL beklagt,
ist %Vor%anstelle von MAILER _...
Versuchen Sie zu laufen:
%Vor%Es sollte etwas geben wie:
%Vor%...
und ich vermute, dass stattdessen "1" in der Sub_part-Spalte des PRIMARY-Index angezeigt wird:
%Vor%...
BTW, der Primärschlüssel ist immer eindeutig, daher ist der zweite Index index2
, den Sie deklarieren, redundant.
Die erste Sache: Sie müssen sicherstellen, dass Sie PRIMARY KEY AUTO_INCREMENT gesetzt wurde. Die zweite Sache: Sie aktivieren Auto-Inkrement einfach durch: ALTER TABLE [Tabellenname] AUTO_INCREMENT = 1 Die dritte Sache: Wenn Sie den Befehl zum Einfügen ausführen, müssen Sie diesen Schlüssel überspringen.
Ich habe diesen Fehler gesehen, wenn ich ein System heruntergefahren oder ein Netzwerkproblem habe. Sie haben wirklich kein Duplikat in Ihrer Datenbank. Das ist ein MySQL-Datenbankfehler. Alles, was Sie tun müssen, ist: Wenn Sie Ihre Insertion machen und es nicht true
ist, ändern Sie einfach eine der Spalten Ihrer Tabelle, die Sie einfügen wollen, entweder von varchar
bis text
oder bigint
und wiederholen dann die Einfügung. Das löst das Problem.
Tags und Links mysql primary-key duplicates