MySQL - 如果最後一行被刪除,自動增量不會按順序遞增
我有一個表,其中包含一個自動遞增的主鍵 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”(它以比章節標題可能暗示的更友好的方式涵蓋了這個問題!)。本質上,如果該值除了作為鍵(或最多攜帶插入順序資訊)之外還具有意義,那麼它可能不應該是自動遞增列,並且如果它除了作為鍵(或最多攜帶插入順序)之外沒有任何意義資訊)然後差距應該無關緊要。