Perilaku auto_increment default di MySQL 5.1 dan yang lebih baru akan "kehilangan" nilai kenaikan otomatis jika INSERT gagal. Artinya, ini bertambah 1 setiap kali, tetapi tidak membatalkan kenaikan jika INSERT gagal. Kehilangan ~750 nilai bukanlah hal yang biasa (saya berkonsultasi dengan situs yang melewatkan 1500 untuk setiap INSERT yang berhasil).
Anda dapat mengubah innodb_autoinc_lock_mode=0
untuk menggunakan perilaku MySQL 5.0 dan menghindari kehilangan nilai dalam beberapa kasus. Lihat http://dev.mysql. com/doc/refman/5.1/en/innodb-auto-increment-handling.html
untuk lebih jelasnya.
Hal lain yang perlu diperiksa adalah nilai auto_increment_increment
variabel konfigurasi. Ini 1 secara default, tetapi Anda mungkin telah mengubahnya. Sekali lagi, sangat jarang untuk menyetelnya ke sesuatu yang lebih tinggi dari 1 atau 2, tetapi mungkin.
Saya setuju dengan komentator lain, kolom autoinc dimaksudkan untuk menjadi unik, tetapi tidak harus berurutan. Anda mungkin tidak perlu terlalu mengkhawatirkannya kecuali jika Anda meningkatkan nilai autoinc begitu cepat sehingga Anda bisa kehabisan jangkauan INT (ini telah terjadi pada saya).
Bagaimana tepatnya Anda memperbaikinya melewatkan 1500 untuk selamanya?
Penyebab INSERT gagal adalah bahwa ada kolom lain dengan batasan UNIK di atasnya, dan INSERT mencoba memasukkan nilai duplikat di kolom itu. Baca halaman manual yang saya tautkan untuk detail tentang mengapa ini penting.
Cara mengatasinya adalah melakukan SELECT terlebih dahulu untuk memeriksa keberadaan nilai sebelum mencoba INSERT. Ini bertentangan dengan kebijaksanaan umum, yaitu hanya mencoba INSERT dan menangani pengecualian kunci duplikat apa pun. Namun dalam kasus ini, efek samping dari INSERT yang gagal menyebabkan nilai auto-inc hilang. Melakukan SELECT terlebih dahulu menghilangkan hampir semua pengecualian tersebut.
Tapi Anda juga harus menangani kemungkinan pengecualian, bahkan jika Anda PILIH terlebih dahulu. Anda masih memiliki kondisi balapan.
Kamu benar! innodb_autoinc_lock_mode=0 bekerja seperti pesona.
Dalam kasus Anda, saya ingin tahu mengapa begitu banyak sisipan yang gagal. Saya menduga bahwa seperti banyak pengembang SQL, Anda tidak memeriksa status sukses setelah Anda melakukan INSERT di penangan AJAX Anda, jadi Anda tidak pernah tahu bahwa begitu banyak dari mereka yang gagal.
Mereka mungkin masih gagal, Anda hanya tidak kehilangan id auto-inc sebagai efek samping. Anda harus benar-benar mendiagnosis mengapa begitu banyak kegagalan terjadi. Anda dapat menghasilkan data yang tidak lengkap, atau menjalankan lebih banyak transaksi daripada yang diperlukan.