なぜ自動インクリメントは、挿入された行数を超えてジャンプするのですか?


11

auto_incrementストアドプロシージャを使用して一括挿入を実行した後、BidsテーブルのbidIDに記録されている値に見られるこの奇妙な動作に非常に混乱しています。

INSERT INTO Bids (itemID, buyerID, bidPrice)
 SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice)
 FROM Items
 WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows;

たとえばauto_increment、開始時にbidID値が101であり、100行挿入した場合、終了値は201ではなく213になります。ただし、挿入された行のbidIDは、最大201まで順次実行されます。

以下を確認して、

SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+

なぜそれが起こっているのか私にはわかりません。何がauto increment値のジャンプを引き起こしているのでしょうか?


MyISAMまたはInnoDBテーブル?
クリスティアンポルタ

@CristianPorta、それはInnoDBです。
質問のオーバーフロー

show variables like '%innodb_autoinc_lock_mode%';出力を共有できますか?
クリスティアンポルタ

テーブル(行の挿入)に関連する他の接続/アクティビティがないことを確認しますか?
ypercubeᵀᴹ

1
良い開始点を@QuestionOverflow:dev.mysql.com/doc/refman/5.5/en/...
クリスティアンポルタ

回答:


10

これは珍しいことではなく、いくつかの原因があります。クエリランナーがカウンターリソースとの競合の問題を減らし、影響を受けるテーブルが同時に更新される場合の効率が向上するように最適化されていることが原因である場合があります。明示的にロールバックされた(またはエラーが発生したために暗黙的にロールバックされた)トランザクションが原因である場合があります。

auto_increment列(またはIDENTITYMSSQL、および概念が通っている他の名前)からの唯一の保証は、各値が一意であり、以前の値よりも小さくなることはないことです。したがって、順序付けの値に依存することはできますが、依存することはできません。ギャップがないように。

列の値にギャップがないようにする必要がある場合は、ビジネスロジックの別のレイヤーまたはトリガーを介してDBで値を自分で管理する必要があります(ただし、トリガーの潜在的なパフォーマンスの問題に注意してください)。自分でロールする場合は、DBエンジンがギャップを許可することで回避する、同時実行性/ロールバック/削除後のクリーンアップ/その他の問題に対処する必要があります)。


この動作が議論されている参照をいくつか提供できますか?
質問のオーバーフロー

1
ここ、SO、および一般に、この問題への言及がかなりあります。「IDENTITYギャップ」、「auto_incrementギャップ」などを検索すると、十分な議論が見つかるはずです。検索をより具体的にするためにDBMS名を追加する場合がありますが、これは非常に一般的な概念であるため、詳細にどのように機能するかを詳細に調べない限り、実際の違いはありません。
David Spillett、2014年

4
MySQLの詳細を参照してください。AUTO_INCREMENTはInnoDB内で取り扱い、それは言及し、:バルク挿入『の自動インクリメント値のギャップが』バルク正確な数を挿入するためのので...ロックモード1又は2の場合、ギャップが連続する文の間で発生する可能性が各ステートメントに必要な自動インクリメント値の数は不明である可能性があり、過大評価が可能です。」
ypercubeᵀᴹ

@ypercube、ありがとう、それはあなたにとって最も役に立ちます。
質問のオーバーフロー

bugs.mysql.com/bug.php?id=34696も参照してください。
trss 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.