2013-10-02 36 views
0

我有一張表,每一行都有一個id,每次插入一個新行時,它都會提供最高的id並加1.但是,我希望新行能夠回收由被刪除的行釋放的數字。我如何找到不存在的最低ID?謝謝找到不存在的最低ID

+9

不要這樣做。自動遞增主鍵不應該混淆。 –

+0

確實是重複的。將刪除 – user2839126

+0

這是一個壞主意。首先,你可以讓你的mysql引擎負責創建一個唯一的標識符(id),並且不建議你自己做這個。第二個ID必須是唯一的,即使被刪除的行也必須有自己的ID。例如,當您擁有名爲william的id爲3的用戶時,您將刪除該用戶並插入一個名稱爲jan的新用戶。威廉願意看到他的數據和搜索他的ID 3,他突然發現有關1月的信息。你關閉不這樣做,讓MySQL做自動增量任務 – botenvouwer

回答

3

您可以在同一張桌子上使用LEFT JOIN,並查看是否存在下一個ID。
我不認爲這個解決方案是非常好的有很多行,但它的工作原理:

SELECT (t.id + 1) 
FROM `table` as t 
LEFT JOIN `table` s ON s.id = (t.id + 1) 
WHERE s.id IS NULL 
ORDER BY t.id 
LIMIT 1 
+0

沒有ORDER BY的極限是非常沒有意義的。只是說;-) – Strawberry

+0

感謝您指出它,我只是編輯我的答案。 – zessx

3

不要重複使用先前使用的ID值。

示例方案:

  • 說你的網站有誰發送電子郵件挑釁濫用用戶。電子郵件會引用用戶的主鍵號碼。您刪除用戶的帳戶以查看違規情況,但電子郵件仍在此處。您可以將已刪除的ID重新分配給新的好用戶,但他一直在抱怨過去濫用的電子郵件,他不負責。

自動增量值應該是獨特但沒有必要對它們進行連續

一個32位帶符號整數可高達2 -1,或2147483647一個64位帶符號整數可高達2 -1,或9223372036854775807你不可能用完所有整數。

MySQL不會取最高值並加1.它會分配序列中的下一個值。由於插入失敗,行被刪除或正在回滾事務,您可能缺少值。這個是正常的。如果你嘗試解決它,你的應用程序將變得緩慢和複雜。您應該按照設計使用自動增量功能,並接受將會有一些不可避免的差距。例外情況:如果您重新啓動MySQL服務,InnoDB的自動增量值將重置爲MAX(id)+1。

+0

人們對身份證號碼的方式太過迷戀。大多數情況下,他們不應該直接暴露給用戶。如有必要,添加一個純粹的化妝品,並且可以根據需要進行調整,而不會破壞數據完整性或回收舊數字。 – tadman

+1

@tadman,是的,在我的書[SQL Antipatterns](http://pragprog.com/book/bksqla/sql-antipatterns)中,我稱自動遞增值爲「Pseudokey Neat-Freak」。 –

0

試試這個:

select id+1 
from users 
where (id+1) not in (select id from users) limit 1 

SQLFiddle:http://www.sqlfiddle.com/#!8/3e5a0/5

注意,我同意誰指示你應該決定是否這是一個很好的設計中使用。如果你可以選擇其他的人不要重複使用數字,我強烈建議你這樣做...