Mysql

MySQL - 如果最後一行被刪除,自動增量不會按順序遞增

  • May 22, 2015

我有一個表,其中包含一個自動遞增的主鍵 ID。如果我刪除最後一行(最高 id,例如 id = 6)並插入新行,則新 id 從 7 開始。我必須更改哪個參數以使主鍵從 6 開始?

CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;

INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');

結果:

id name

1 狗

2 貓

3 企鵝

4 鬆懈

5 鯨魚

6 鴕鳥

DELETE FROM animals WHERE id = 6;
INSERT INTO animals (name) VALUES
('x');

結果:

id 名稱

1 狗

2 貓

3 企鵝

4 鬆懈

5 鯨魚

7 x

謝謝你的建議。

這是設計使然 - 所有 DBMS 行為都是使用自動增量列。

如果他們沒有外部參照完整性可能會被破壞。舉一個簡單的例子,假設您正在使用自動增量列作為鍵來儲存縮短服務的 URL。您不知道縮短的 URL 是否已提供給任何人,而數據庫肯定沒有,因此重用 ID 1234 可能會導致某人的可憐的奶奶在點擊http://時訪問 somenastypornsite.xxx 而不是 loverlyknitting.org /shortthi.ng/1234在舊電子郵件中,而不是收到“抱歉,但我們的記錄中不再存在此連結”消息。

此外,如果您在刪除最後一項後重置增量,當第 5 項被刪除時,您是否還會經歷所有工作(或期望數據庫)在 500 萬的第 5 項之後重新編號所有內容?完成對其他表的更改,其中它們是指向增量列的外鍵約束?這樣的額外工作可能會在 IO 方面變得非常昂貴。

如果您在刪除最後一項後確實重置了增量點,請務必非常小心您的事務隔離級別:您可能會在另一個事務使用該值時重置它,從而導致錯誤(或更糟糕的是,靜默失敗),除非您確保您的操作是完全 100% 孤立的。

我通常建議使用數據庫的人閱讀“SQL Antipatterns”,其中有一章關於這個問題,名為“Psuedo-Key Neat Freaks”(它以比章節標題可能暗示的更友好的方式涵蓋了這個問題!)。本質上,如果該值除了作為鍵(或最多攜帶插入順序資訊)之外還具有意義,那麼它可能不應該是自動遞增列,並且如果它除了作為鍵(或最多攜帶插入順序)之外沒有任何意義資訊)然後差距應該無關緊要。

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