我有一張表,每一行都有一個id,每次插入一個新行時,它都會提供最高的id並加1.但是,我希望新行能夠回收由被刪除的行釋放的數字。我如何找到不存在的最低ID?謝謝找到不存在的最低ID
回答
您可以在同一張桌子上使用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
沒有ORDER BY的極限是非常沒有意義的。只是說;-) – Strawberry
感謝您指出它,我只是編輯我的答案。 – zessx
您可以使用AUTO_INCREMENT獲取唯一增加的ID,但通常不會重複使用它們。重用舊值有什麼好處?
編號:http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
不要重複使用先前使用的ID值。
示例方案:
- 說你的網站有誰發送電子郵件挑釁濫用用戶。電子郵件會引用用戶的主鍵號碼。您刪除用戶的帳戶以查看違規情況,但電子郵件仍在此處。您可以將已刪除的ID重新分配給新的好用戶,但他一直在抱怨過去濫用的電子郵件,他不負責。
自動增量值應該是獨特但沒有必要對它們進行連續。
一個32位帶符號整數可高達2 -1,或2147483647一個64位帶符號整數可高達2 -1,或9223372036854775807你不可能用完所有整數。
MySQL不會取最高值並加1.它會分配序列中的下一個值。由於插入失敗,行被刪除或正在回滾事務,您可能缺少值。這個是正常的。如果你嘗試解決它,你的應用程序將變得緩慢和複雜。您應該按照設計使用自動增量功能,並接受將會有一些不可避免的差距。例外情況:如果您重新啓動MySQL服務,InnoDB的自動增量值將重置爲MAX(id)+1。
人們對身份證號碼的方式太過迷戀。大多數情況下,他們不應該直接暴露給用戶。如有必要,添加一個純粹的化妝品,並且可以根據需要進行調整,而不會破壞數據完整性或回收舊數字。 – tadman
@tadman,是的,在我的書[SQL Antipatterns](http://pragprog.com/book/bksqla/sql-antipatterns)中,我稱自動遞增值爲「Pseudokey Neat-Freak」。 –
試試這個:
select id+1
from users
where (id+1) not in (select id from users) limit 1
SQLFiddle:http://www.sqlfiddle.com/#!8/3e5a0/5
注意,我同意誰指示你應該決定是否這是一個很好的設計中使用。如果你可以選擇其他的人不要重複使用數字,我強烈建議你這樣做...
- 1. Ruby:在ID數組中找到最低的空閒ID
- 2. 最低的ID
- 3. 如何找到低ID和最大ID(我的SQL)?
- 4. 找到最高和最低的號碼
- 5. 找到最低和最高的多列
- 6. 找到最低公倍數
- 7. 找到最低設置位
- 8. XSLT找到最低價格
- 9. MIPS找到最低值?
- 10. 找到最低的組號的一排,而不僅僅是最低
- 11. SQL:選擇不存在的最低值
- 12. 的Rails找到以最低的價格
- 13. 找到最低值的PHP foreach循環
- 14. 從NSArray找到最低的NSInteger
- 15. 找到最低的鄰居MATLAB
- 16. 找到最低的x和y
- 17. 找到所有高值的最低值
- 18. 獲得通過最低ID
- 19. 在輸入的10個數字中找到最高和最低
- 20. 在數組中找到最低最高10%的僞代碼
- 21. 查找列表中最低的未使用的唯一ID
- 22. 最高到最低
- 23. 如何找到最低成本?
- 24. 找到最低和最右邊的像素來找到圖像的角度
- 25. 在mongodb中找不到id
- 26. 在SQL如何找到最低和最高值
- 27. 找到最低的數字,而不比較
- 28. 查找ID找不到ID並創建
- 29. 刪除最低ID的條目
- 30. TSQL獲取最低值的ID
不要這樣做。自動遞增主鍵不應該混淆。 –
確實是重複的。將刪除 – user2839126
這是一個壞主意。首先,你可以讓你的mysql引擎負責創建一個唯一的標識符(id),並且不建議你自己做這個。第二個ID必須是唯一的,即使被刪除的行也必須有自己的ID。例如,當您擁有名爲william的id爲3的用戶時,您將刪除該用戶並插入一個名稱爲jan的新用戶。威廉願意看到他的數據和搜索他的ID 3,他突然發現有關1月的信息。你關閉不這樣做,讓MySQL做自動增量任務 – botenvouwer