Mysql

為什麼自動增量跳躍的數量超過插入的行數?

  • December 10, 2020

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 行,則結束值變為 213 而不是 201。但是,這些插入行的 bidID 按順序執行,最大值為 201。

檢查以下內容後,

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

我不知道為什麼會這樣。什麼可能導致auto increment價值跳躍?

這並不罕見,有幾個原因。有時這是由於查詢執行器進行了優化以減少與計數器資源的爭用問題,從而在受影響的表有並發更新時提高效率。有時是由於事務顯式回滾(或由於遇到錯誤而隱式回滾)。

auto_increment列(或在 MSSQL 中,以及該概念所採用的其他名稱)的唯一保證IDENTITY是每個值都是唯一的,並且永遠不會小於前一個值:因此您可以依賴這些值進行排序,但不能依賴他們不要有差距。

如果您需要列的值完全沒有間隙,您將需要自己管理這些值,無論是在另一層業務邏輯中還是通過觸發器在數據庫中(但要小心觸發器的潛在性能問題),當然如果您確實自己滾動,您將不得不應對數據庫引擎通過允許間隙來解決的所有並發/回滾/刪除後清理/其他問題)。

引用自:https://dba.stackexchange.com/questions/60295