InnoDB では、INSERT IGNORE または ON DUPLICATE KEY UPDATE を実行すると、何かが挿入されたかどうかに関係なく、テーブルが auto_increment されます。
この問題は哀れなほど厄介です。
これを回避する簡単な方法はありますか?
InnoDB では、INSERT IGNORE または ON DUPLICATE KEY UPDATE を実行すると、何かが挿入されたかどうかに関係なく、テーブルが auto_increment されます。
この問題は哀れなほど厄介です。
これを回避する簡単な方法はありますか?
InnoDB では、トランザクションをロールバックできます。これは、あるテーブルに挿入し、関連するレコードを別のテーブルに挿入できず、最初の挿入をロールバックできることを意味します。その間、一意の ID も必要とする最初のテーブルで他の挿入が発生する可能性があります。その場合、配られた自動インクリメントを放棄することはできません。
INSERT IGNORE では、InnoDB は、挿入を試行することによって、既にレコードがあるかどうかしかわかりません。挿入前に自動インクリメントが必要です。他のプロセスが同じことを行い、選択と挿入の間に同じレコードを挿入している可能性があるため、検索してから挿入することはできません。
フィールドの最大値を超えると思わない限り、心配する必要があります。bigint の場合、これは非常に大きいです。Facebook は bigint を使用しており、まだ不足していません。
特別なミューテックス テーブルを使用して、INSERT IGNORE の動作を模倣できます。
この記事を参照してください: