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