1

InnoDB では、INSERT IGNORE または ON DUPLICATE KEY UPDATE を実行すると、何かが挿入されたかどうかに関係なく、テーブルが auto_increment されます。

この問題は哀れなほど厄介です。

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

4

2 に答える 2

0

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

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

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

于 2012-03-08T01:29:36.337 に答える
0

特別なミューテックス テーブルを使用して、INSERT IGNORE の動作を模倣できます。

この記事を参照してください:

INSERT IGNORE を使用して InnoDB の自動インクリメント ホールを回避する

于 2012-03-08T01:13:12.520 に答える