丟失的自動增量 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
的大小溢位。