2012-10-30 31 views
0

可能重複:
How to fill in the 「holes」 in auto-incremenet fields?添加+1與PHP最後一個入口/ MySQL的(自動遞增)

目前,我們正在使用自動增量上的表,其中的條目來不斷地去。這樣做的問題是,最終自動增量ID變得很大,因爲這是自動增量的工作原理。

我們希望它始終爲最後一項添加+1。

例如:
我們有4個條目,id 4被刪除。下一個添加的條目應該是4而不是5。但搜索後,我只能找到解決方法,如何獲得下一個自動增量編號,這不是我正在尋找的。

+0

自動增量的問題是什麼? –

+1

我強烈建議不要這樣的計劃。如果你重新使用id的話,你最終會引用錯誤的行,而不是引用錯誤。它可能很難調試,並可能導致安全漏洞。 –

+0

自動增量值的問題是什麼?它是專門爲此設計的,無論它獲得多麼「巨大」和「滾動你自己」使用最後一項+ 1會給你不斷的問題 –

回答

1

你應該這樣做,因爲AUTO_INCREMENT是這樣設計有很好的理由(比如,如果你有一個備份,你想,當它包含的是舊刪除ID已被重寫了,你怎麼做才能恢復呢?)

但是,爲了回答你的問題: 必須使用

刪除後,你可以做一個觸發

+0

這會破壞他的數據一致性。 (看我的文章) – tftd

+1

然後我編輯它使用id + 1而不是id。如果他不刪除最後一個ID,他仍然會在他的桌子上出現漏洞,但是他不應該改變auto_increment的行爲,我們都同意 –

+1

不應該是MAX(id)+ 1而不是MAX( id + 1)'? – Buksy

0

如果你真的想這樣做(我個人鼓勵你使用自動增量),你需要執行一個事務,以獲得最後一個ID並插入新行,將其ID設置爲根據另一個ID進行遞增一。

-3

您可以選擇最大的id值,然後遞增它。

SELECT MAX(`id`)+1 as `new id` FROM `table`; 

如果你有5個條目,第3個被刪除,這仍然會讓你作爲下一個ID。

+1

但是,如果2個查詢同時運行,它們都將獲得6作爲下一個ID。但auto_increment也會正確提供6和7. –

+0

我認爲這是顯而易見的。你將不得不鎖定桌子。 – Buksy

-1

這不是一個好主意,做這個,T無論記錄是否存在或被刪除,他的ID都應始終保持唯一。

但是,如果你真的想這樣做,你可以用的東西像

select max(id) + 1 of bla; 

但你需要爲它的正確的交易水平,因爲如果不這樣做,你有重複的ID的可能性。