Otomatik artış sayacı diskte değil, yalnızca ana bellekte saklanır.
http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html
Bu nedenle, hizmet (veya sunucu) yeniden başlatıldığında aşağıdakiler gerçekleşir:
Bir sunucu başlattıktan sonra, t tablosuna ilk ekleme için, InnoDB bu ifadenin eşdeğerini çalıştırır: SELECT MAX (ai_col) FROM t FOR UPDATE;
InnoDB deyim tarafından alınan değeri bir arttırır ve bunu sütuna ve tablonun otomatik artış sayacına atar. Tablo boşsa, InnoDB 1 değerini kullanır.
Yani basit İngilizce'de, MySQL hizmeti başladıktan sonra tablonuz için otomatik artış değerinin ne olması gerektiği hakkında hiçbir fikri yoktur. Bu nedenle, ilk satır eklediğinizde, otomatik artış kullanan alanın maksimum değerini bulur, bu değere 1 ekler ve elde edilen değeri kullanır. Satır yoksa, 1'den başlar.
Kullanıcıların üçüncü taraf ödeme sitesine yönlendirildikleri çok iş parçacıklı bir ortamda kimlikleri düzgün bir şekilde yönetmek için tabloyu ve mysql'in otomatik artış özelliğini kullandığımız için bu bizim için bir sorundu. Bu nedenle, üçüncü tarafın bize gönderdiği ve bize geri gönderdiği kimliğin benzersiz olduğundan ve bu şekilde kalacağından emin olmak zorunda kaldık (ve elbette, kullanıcının yönlendirildikten sonra işlemi iptal etme olasılığı vardır).
Bu nedenle, bir satır oluşturuyor, oluşturulan otomatik artış değerini elde ediyor, tabloyu temiz tutmak için satırı siliyor ve değeri ödeme sitesine yönlendiriyoruz. InnoDB'nin AI değerlerini işleme biçimini gidermek için yaptığımız şey şuydu:
$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);
Bu, her zaman gereksiz yere tablo havaya uçurmadan oluşturulan bir satırda oluşturulan en son işlemId tutar.
Umarım bu durumla karşılaşabilecek herkese yardımcı olur.
Düzenleme (2018-04-18) :
Aşağıda belirtildiği gibi, bunun davranışı MySQL 8.0+ ile değiştirilmiş gibi görünüyor.
https://dev.mysql.com/worklog/task/?id=6204
Bu çalışma günlüğündeki ifadeler en iyi şekilde hatalıdır, ancak bu yeni sürümlerde InnoDB'nin artık yeniden başlatmalarda kalıcı autoinc değerlerini desteklediği görülmektedir.
-Gremio