丟失的自動增量 ID

幾個插入功能可以燒錄ID。這是一個例子,使用 InnoDB(其他引擎可能以不同的方式工作):

CREATE TABLE Burn (
    id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL,
    name VARCHAR(99) NOT NULL,
    PRIMARY KEY(id),
    UNIQUE(name)
        ) ENGINE=InnoDB;

INSERT IGNORE INTO Burn (name) VALUES ('first'), ('second');
SELECT LAST_INSERT_ID();          -- 1
SELECT * FROM Burn ORDER BY id;
  +----+--------+
  |  1 | first  |
  |  2 | second |
  +----+--------+

INSERT IGNORE INTO Burn (name) VALUES ('second');  -- dup 'IGNOREd', but id=3 is burned
SELECT LAST_INSERT_ID();          -- Still "1" -- can't trust in this situation
SELECT * FROM Burn ORDER BY id;
  +----+--------+
  |  1 | first  |
  |  2 | second |
  +----+--------+

INSERT IGNORE INTO Burn (name) VALUES ('third');
SELECT LAST_INSERT_ID();           -- now "4"
SELECT * FROM Burn ORDER BY id;    -- note that id=3 was skipped over
  +----+--------+
  |  1 | first  |
  |  2 | second |
  |  4 | third  |    -- notice that id=3 has been 'burned'
  +----+--------+

想想吧(大致)是這樣的:首先插入看起來,看看有多少行可能會被插入。然後從該表的 auto_increment 中獲取那麼多值。最後,根據需要使用 ID 插入行,並燒掉任何剩餘部分。

剩餘可恢復的唯一時間是系統是否已關閉並重新啟動。重啟時,有效地執行 MAX(id)。這可能會重複使用被燒燬或被最高 id 的 tihuan 釋放的 ID。

基本上任何風味的 INSERT(包括 REPLACE,即 DELETE + INSERT)都可以燃燒 ids。在 InnoDB 中,全域性(非會話!)變數 innodb_autoinc_lock_mode 可用於控制正在發生的一些事情。

當將長字串標準化AUTO INCREMENT id 時,很容易發生燃燒。這可能會導致你選擇的 INT 的大小溢位。