丢失的自动增量 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 的大小溢出。