Счетчик автоинкремента хранится только в основной памяти, а не на диске.
http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html
Из-за этого при перезапуске службы (или сервера) произойдет следующее:
После запуска сервера для первой вставки в таблицу t InnoDB выполняет эквивалент этого оператора: SELECT MAX (ai_col) FROM t FOR UPDATE;
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);
При этом всегда сохраняется последний идентификатор транзакции, сгенерированный в виде строки в таблице, без ненужного взрыва таблицы.
Надеюсь, это поможет кому-то еще, кто может столкнуться с этим.
Изменить (2018-04-18) :
Как Finesse упоминается ниже, похоже, что поведение было изменено в MySQL 8.0+.
https://dev.mysql.com/worklog/task/?id=6204
Формулировка в этом рабочем журнале в лучшем случае ошибочна, однако, похоже, что InnoDB в этих более новых версиях теперь поддерживает постоянные значения autoinc при перезагрузках.
-Gremio