Problem:
Bei Verwendung von INSERT ... ON DUPLICATE KEY UPDATE-Anweisung mit einer Tabelle, die eine automatisch inkrementierende Spalte (ID) enthält, scheint sich der ID-Wert seltsam zu erhöhen, wenn ein doppelter Schlüssel vorhanden ist angetroffen. Beim ersten Einfügen (ohne doppelten Schlüssel) wird die ID normal erhöht. Wenn jedoch die ON DUPLICATE KEY-Klausel ausgelöst wird und eine neue Zeile eingefügt wird, wird der ID-Wert inkonsistent.
Antwort:
Dieses Verhalten ist beabsichtigt und wird von MySQL dokumentiert . Wenn eine Zeile eingefügt wird, die zu einem doppelten Wert in einem eindeutigen Index oder Primärschlüssel führen würde, führt MySQL eine Aktualisierung der alten Zeile durch, anstatt eine neue einzufügen. Dies bedeutet, dass der ID-Wert zu diesem Zeitpunkt bereits erhöht wird, auch wenn die INSERT-Anweisung zuerst versucht wird.
Die folgende Aktualisierung erhöht den ID-Wert nicht, da die automatisch inkrementierten Spalten nicht durch die UPDATE-Anweisung aktualisiert werden . Stattdessen bleibt der ID-Wert aus der ursprünglichen (jetzt aktualisierten) Zeile erhalten.
Lösung:
Um die automatische Inkrementierung ohne Lücken aufrechtzuerhalten, muss ein anderer verwendet werden Ansatz. Eine Möglichkeit besteht darin, inkrementelle Werte für die Ausgabe zu berechnen, anstatt sich auf die Spalte für die automatische Inkrementierung zu verlassen. Alternativ kann ein komplexerer Ansatz mit Tabellensperren und Triggern verwendet werden, um Zeilen neu zu nummerieren und sicherzustellen, dass keine Lücken in den ID-Werten entstehen.
Das obige ist der detaillierte Inhalt vonWarum verhält sich MySQLs AUTO_INCREMENT inkonsistent mit INSERT ... ON DUPLICATE KEY UPDATE?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!