2012-03-08 10 views
1

InnoDBでは、INSERT IGNOREまたはON DUPLICATE KEY UPDATEを実行するたびに、何かが挿入されているかどうかに関係なく、テーブルがauto_incrementされます。IGNOREでInnoDBの自動インクリメントを行う方法はありますか?

この問題は、痛ましいほど厄介です。

これを回避する簡単な方法はありますか?

+2

これは問題ではない、それは望ましい機能です。 **その周りに**あるべきではありませんが、私はrepハンターがテーブルを変更し、増分カウントをリセットすることを示唆しています。ただしないでください。 –

+2

多くの月前に私はそれをやらせて、データベーステーブルのIDを単調に増やすことについて心配しないように確信しました。 – Perry

+0

以来、私はもっと幸せな人生を送ってきたと思います。データベースにそれをさせてください。最後の挿入IDを取得しようとしている場合は、トランザクション内でクエリをラップする必要があります。 IDの不足を心配している場合は、id colがunsignedに設定されていることを確認してください。 –

答えて

0

InnoDBはトランザクションをロールバックすることができます。つまり、あるテーブルに挿入したり、関連するレコードを別のテーブルに挿入したり、最初の挿入をロールバックしたりすることはできません。その間、一意のIDも必要とする最初のテーブルで他の挿入が発生する可能性があります。その場合、渡された自動インクリメントをあきらめることはできません。

INSERT IGNOREでは、InnoDBは挿入しようとするとすでにレコードがあるかどうかだけを知ることができます。挿入前に自動インクリメントが必要です。他のプロセスが同じことをしていて、選択と挿入の間に同じレコードを挿入している可能性があるため、挿入を検索することはできません。

フィールドの最大値を超えると思わない限り、心配する必要があります。 bigintについては、それは非常に大きいです。 Facebookはbigintを使用しており、まだ実行されていません。

関連する問題