Лічильник автоматичного збільшення лише зберігається в основній пам'яті, а не на диску.
http://dev.mysql.com/doc/refman/4.1/uk/innodb-auto-increment-handling.html
Через це, коли служба (або сервер) перезапуститься, станеться таке:
Після запуску сервера, для першої вставки в таблицю t, InnoDB виконує еквівалент цього оператора: SELECT MAX (ai_col) ВІД t ЗА ОНОВЛЕННЯ;
Збільшення InnoDB на одне значення, отримане в операторі і призначає його стовпцю та лічильнику автоматичного збільшення для таблиці. Якщо таблиця порожня, InnoDB використовує значення 1.
Отже, простою англійською мовою після запуску служби MySQL вона не має уявлення про те, яким має бути значення автоматичного збільшення вашої таблиці. Отже, коли ви вперше вставляєте рядок, воно знаходить максимальне значення поля, яке використовує автоматичне збільшення, додає 1 до цього значення та використовує отримане значення. Якщо рядків немає, він розпочнеться з 1.
Це було для нас проблемою, оскільки ми використовували функцію таблиці та автоматичного збільшення функції mysql, щоб акуратно керувати ідентифікаторами у багатопотоковому середовищі, де користувачі перенаправлялися на сторонній веб-сайт оплати. Таким чином, ми повинні були переконатися, що ідентифікатор, який отримала третя сторона та повернув нам назад, був унікальним і залишився таким (і, звичайно, є можливість, щоб користувач скасував транзакцію після того, як був перенаправлений).
Таким чином, ми створювали рядок, отримували згенероване значення автоматичного збільшення, видаляли рядок для збереження чистоти таблиці та пересилали значення на сайт оплати. Ми вирішили вирішити питання про те, як InnoDB обробляє значення 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);
Це завжди зберігає останню згенеровану ID транзакції у вигляді рядка в таблиці, без зайвого підриву таблиці.
Сподіваємось, що це допоможе комусь, хто може зіткнутися з цим.
Редагувати (2018-04-18) :
Як зазначено нижче Finesse, схоже, поведінка цього варіанту була змінена в MySQL 8.0+.
https://dev.mysql.com/worklog/task/?id=6204
Формулювання в цьому робочому журналі в кращому випадку є несправним, проте, як видається, InnoDB у тих новіших версіях тепер підтримує стійкі значення автоінциклу через перезавантаження.
-Греміо