MySQL 5.1以降のデフォルトのauto_increment動作は、INSERTが失敗した場合、自動インクリメント値を「失います」。つまり、毎回1ずつ増加しますが、INSERTが失敗した場合は増加を元に戻しません。 〜750の値を失うことはめったにありませんが、不可能ではありません(成功したINSERTごとに1500をスキップするサイトについて相談しました)。
innodb_autoinc_lock_mode=0
を変更できます MySQL 5.0の動作を使用し、場合によっては値が失われないようにします。 http://dev.mysqlを参照してください。 com / doc / refman / 5.1 / en / innodb-auto-increment-handling.html
詳細については。
チェックするもう1つのことは、auto_increment_increment
の値です。 構成変数。デフォルトでは1ですが、これを変更した可能性があります。繰り返しになりますが、1または2より高い値に設定することは非常にまれですが、可能です。
私は他のコメント提供者に同意します。autoinc列は一意であることが意図されていますが、必ずしも連続している必要はありません。 INTの範囲を使い果たす可能性があるほど急速にautoinc値を進めていない限り、おそらくそれほど心配する必要はありません(これは私に起こりました)。
挿入するために1500をスキップして、どの程度正確に修正しましたか?
INSERTが失敗する原因は、UNIQUE制約のある別の列があり、INSERTがその列に重複する値を挿入しようとしたことです。これが重要である理由の詳細については、リンクしたマニュアルページをお読みください。
修正は、INSERTを試みる前に、最初にSELECTを実行して値の存在を確認することでした。これは、INSERTを試して、重複するキーの例外を処理するという一般的な知識に反します。ただし、この場合、失敗したINSERTの副作用により、auto-inc値が失われました。最初にSELECTを実行すると、そのような例外のほとんどすべてが排除されました。
しかし、あなたも 最初にSELECTを実行した場合でも、発生する可能性のある例外を処理する必要があります。まだ競合状態があります。
あなたが正しい! innodb_autoinc_lock_mode=0は魅力のように機能しました。
あなたの場合、理由を知りたいと思います 非常に多くの挿入が失敗しています。多くのSQL開発者と同様に、AJAXハンドラーでINSERTを実行した後は成功ステータスをチェックしていないので、多くの開発者が失敗していることを知ることはできません。
それらはおそらくまだ失敗しています、あなたは副作用としてauto-incidを失っていません。なぜこれほど多くの失敗が発生するのかを本当に診断する必要があります。不完全なデータを生成しているか、必要以上に多くのトランザクションを実行している可能性があります。