Licznik automatycznego przyrostu jest przechowywany tylko w pamięci głównej, a nie na dysku.
http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html
Z tego powodu po ponownym uruchomieniu usługi (lub serwera) nastąpi:
Po uruchomieniu serwera, dla pierwszego wstawienia do tabeli t, InnoDB wykonuje odpowiednik tej instrukcji: SELECT MAX (ai_col) FROM t FOR UPDATE;
InnoDB zwiększa o jeden wartość pobraną przez instrukcję i przypisuje ją do kolumny oraz licznika automatycznego przyrostu dla tabeli. Jeśli tabela jest pusta, InnoDB używa wartości 1.
Mówiąc wprost, po uruchomieniu usługi MySQL nie ma pojęcia, jaka powinna być wartość automatycznego przyrostu tabeli. Kiedy więc wstawisz wiersz po raz pierwszy, znajdzie maksymalną wartość pola, które korzysta z automatycznego przyrostu, dodaje 1 do tej wartości i używa wartości wynikowej. Jeśli nie ma żadnych wierszy, rozpocznie się od 1.
Był to dla nas problem, ponieważ używaliśmy funkcji automatycznego zwiększania tabeli i mysql do porządnego zarządzania identyfikatorami w wielowątkowym środowisku, w którym użytkownicy przekierowywani byli na stronę płatniczą innej firmy. Musieliśmy więc upewnić się, że identyfikator, który osoba trzecia otrzymała i odesłał do nas, był unikalny i pozostanie w ten sposób (i oczywiście istnieje możliwość anulowania transakcji przez użytkownika po przekierowaniu).
Tworzyliśmy więc wiersz, uzyskiwaliśmy wygenerowaną wartość automatycznego przyrostu, usuwaliśmy wiersz, aby utrzymać tabelę w czystości, i przesyłaliśmy wartość na stronę płatności. Ostatecznie zrobiliśmy to, aby naprawić problem, w jaki InnoDB obsługuje wartości AI:
$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);
To zawsze utrzymuje najnowszą transakcję wygenerowaną jako wiersz w tabeli, bez niepotrzebnego wysadzania tabeli.
Mam nadzieję, że pomoże to każdemu, kto na to wpadnie.
Edytuj (2018-04-18) :
Jak wspomniano poniżej Finesse, wygląda na to, że zostało to zmodyfikowane w MySQL 8.0+.
https://dev.mysql.com/worklog/task/?id=6204
Sformułowanie w tym dzienniku pracy jest co najwyżej błędne, jednak wydaje się, że InnoDB w tych nowszych wersjach obsługuje teraz trwałe wartości autoinc podczas ponownego uruchamiania.
-Gremio