Der Auto-Inkrement-Zähler wird nur im Hauptspeicher und nicht auf der Festplatte gespeichert.
http://dev.mysql.com/doc/refman/4.1/de/innodb-auto-increment-handling.html
Aus diesem Grund geschieht beim Neustart des Dienstes (oder Servers) Folgendes:
Nach einem Serverstart führt InnoDB beim ersten Einfügen in eine Tabelle t das Äquivalent dieser Anweisung aus: SELECT MAX (ai_col) FROM t FOR UPDATE;
InnoDB erhöht den von der Anweisung abgerufenen Wert um eins und weist ihn der Spalte und dem Auto-Increment-Zähler für die Tabelle zu. Wenn die Tabelle leer ist, verwendet InnoDB den Wert 1.
Nachdem der MySQL-Dienst gestartet wurde, hat er im Klartext keine Ahnung, wie hoch der Auto-Inkrement-Wert für Ihre Tabelle sein sollte. Wenn Sie also zum ersten Mal eine Zeile einfügen, wird der Maximalwert des Felds ermittelt, das die automatische Inkrementierung verwendet, 1 zu diesem Wert hinzugefügt und der resultierende Wert verwendet. Wenn keine Zeilen vorhanden sind, wird mit 1 begonnen.
Dies war ein Problem für uns, da wir die Tabelle und die automatische Inkrementierungsfunktion von mysql verwendeten, um IDs in einer Umgebung mit mehreren Threads sauber zu verwalten, in der Benutzer zu einer Zahlungswebsite eines Drittanbieters weitergeleitet wurden. Daher mussten wir sicherstellen, dass die ID, die der Dritte erhalten und an uns zurückgesandt hat, eindeutig ist und dies auch bleibt (und natürlich besteht die Möglichkeit, dass der Benutzer die Transaktion nach der Weiterleitung storniert).
Also haben wir eine Zeile erstellt, den generierten Wert für die automatische Inkrementierung abgerufen, die Zeile gelöscht, um die Tabelle sauber zu halten, und den Wert an die Zahlungssite weitergeleitet. Am Ende haben wir Folgendes getan, um das Problem zu beheben, wie InnoDB AI-Werte verarbeitet:
$query = "INSERT INTO transactions_counter () VALUES ();";
mysql_query($query);
$transactionId = mysql_insert_id();
$previousId = $transactionId - 1;
$query = "DELETE FROM transactions_counter WHERE transactionId='$previousId';";
mysql_query($query);
Auf diese Weise wird immer die letzte als Zeile in der Tabelle generierte Transaktions-ID beibehalten, ohne dass die Tabelle unnötig in die Luft gesprengt wird.
Hoffe, das hilft allen anderen, die darauf stoßen könnten.
Bearbeiten (2018-04-18) :
Wie Finesse weiter unten erwähnte, wurde das Verhalten in MySQL 8.0+ geändert.
https://dev.mysql.com/worklog/task/?id=6204
Der Wortlaut in diesem Worklog ist bestenfalls fehlerhaft, es scheint jedoch, dass InnoDB in diesen neueren Versionen nun persistente Autoinc-Werte über Neustarts hinweg unterstützt.
-Gremio