2009-12-24 67 views
1

我有一個帶有自動增量id字段的MySQL表。當我刪除一行然後插入一個新行時,我刪除的行的id被跳過,新獲得的id比前一行大。有什麼辦法可以防止這種情況發生?我希望新的一排替換舊的。有沒有一個重要的原因,爲什麼這種情況我失蹤了?防止在MySQL ID字段中出現空白

+3

你正試圖在這裏的雷區挖洞。風險是併發性錯誤,其確切性質取決於您的應用程序。自動遞增ID實際上是免費的(當然,它們可以溢出,但暫且擱置)。只要接受序列中會有差距並繼續前進。 – Asaph 2009-12-24 04:52:39

+1

基本上,你要求做的是讓2個記錄共享相同的主鍵;一個剛創建的記錄和另一個剛剛被刪除的記錄。想象一下,您的網站用戶在被刪除之前打開了一個引用刪除記錄的頁面,並創建了新記錄。想象一下,這個用戶然後提交一個更新到刪除的記錄。在正確設計的應用程序中,下一步應該發生的情況是更新失敗,因爲記錄已被刪除。相反,新記錄會使用已刪除記錄的數據進行更新。 – Asaph 2009-12-24 05:14:53

回答

0

自動增量字段的定義是每插入一個新行都保證獲得唯一值。如果你想保留舊值,那麼你必須更新行而不是替換它。如果您的設計要求自動增量列值保持連續,那麼您將不得不自己管理它。

+0

'UPDATE' =='REPLACE'? – 2009-12-24 04:51:29

+0

不,我在刪除原文的意義上使用了「替換」一詞,並添加了新的一行。 – 2009-12-24 04:52:43

0

對不起,但我不知道確切的原因。

AFAIK你不能避免這種行爲,除非你在TRUNCATE表或明確指定id。

1

MySQL的自動遞增功能永遠不會倒退,除非你強制它。有一個很好的理由。如果有遺漏的記錄(日誌,表格等等),那該怎麼辦?

您可以使用此命令強制:

ALTER TABLE tbl AUTO_INCREMENT = 1000; 

或者,如果你需要做它作爲查詢的一部分:

LOCK TABLES tbl WRITE; 
SELECT @id := MAX(id) FROM tbl; 
INSERT INTO tbl SET [email protected], ...; 
UNLOCK TABLES; 

如果你正使用InnoDB,你可以這樣做這在交易中取而代之...

但是,最好不要這樣做。