我已經在oracle中使用序列和觸發器在我的表上實現了自動遞增。 輸入的前兩個記錄具有連續順序的ID,但在第三個記錄的輸入處存在缺口。 ID是8。在刪除記錄並使新記錄變爲時,ID變爲9. 如何刪除間隙並將第三條記錄的ID作爲3並以連續的順序獲取下一個。 如果一行被刪除,新行將以新序列開始還是繼續從已刪除序列? 我該如何解決這個問題? 請幫忙在Oracle10g for ID的自動遞增中,如果一行被刪除,新行是以新序列開始還是從已刪除序列繼續
0
A
回答
2
序列中的空白不會被重複使用。無論如何,即使沒有刪除,由於緩存,回滾,RAC等原因,您仍然應該預料到缺口。如果您使用RAC,您甚至可能無法按照預期的順序獲取序列。一個ID,特別是一個「自動遞增」的ID通常是一個合成主鍵,並且該鍵的實際值沒有內在含義,它只需要是唯一的。
Tom Kyte has a view on this subject,當然。
如果差距被重複使用,如果您添加了三條記錄,分別得到了ID 1,2和3,然後刪除了記錄2,會發生什麼?下一個插入的記錄是否會獲得ID 2或4?即使你填補了空白(這意味着序列化,基本上忽略了序列),那麼這些ID並不是按照它們插入的順序,所以你仍然無法從查看ID中識別出任何東西。你不知道,從ID,他們插入的順序。
如果你真的想出於顯示目的無縫的編號,你可以忽略的ID值,並使用一個僞列:
select t.column1, t.column2, ...,
row_number() over (order by t.id) as rn
from your_table t;
如果您需要跟蹤它們插入然後添加一個時間戳字段和設置的順序那到sys_timestamp
也在你的觸發器中。然後,您可以生成一個順序無縫的數字:
select t.column1, t.column2, ...,
row_number() over (order by t.inserted) as rn
from your_table t;
相關問題
- 1. 中間刪除一行,如何刷新表ID(自動遞增)在MySQL
- 2. 還原已刪除的自動遞增ID?
- 3. 我們可以重新插入刪除自動遞增ID
- 4. 從DataGrid中自動刪除新行
- 5. 顯示刪除的自動遞增行
- 6. 從行中刪除一列
- 7. 刪除新行,如果下一行不以數字開頭
- 8. 從序列中的兩個列表中刪除連續序列
- 9. PHP刪除按鈕總是開始刪除最後一行
- 10. 如何刪除活動記錄中已刪除行的ID
- 11. 如何刪除行(不是自動遞增)
- 12. 如何在刪除表中的行時更新自動增加的ID?
- 13. 自動遞減行序列號,同時刪除
- 14. 如何在刪除行時始終在mysql中序列化id行
- 15. datatable重新排序刪除一行
- 16. 刪除開始,在陣列
- 17. 從列表中刪除項目後對行類重新排序
- 18. JQuery克隆增量ID不是即將到來的序列和刪除行也
- 19. Mysql的MyISAM數據重新使用被刪除的自動遞增的ID
- 20. 從列表中刪除一行並將所有連續行刪除到N?
- 21. 如何自動設置新的id值作爲已刪除行的ID
- 22. 在刪除行後刷新webelements列表
- 23. 從自動遞增的列中刪除值
- 24. MySQL從表或更新表列刪除標記爲已刪除?
- 25. 如何從數據表中刪除空數據行,除了自動增量列
- 26. 當一列中的值不是以連續的方式增加時,如何從數據框中刪除行
- 27. 如果行中的一個id是無效的,刪除行中的行
- 28. 刪除無序列表中的空行
- 29. 如果列爲空,則刪除一行
- 30. 使用序列和觸發器我在Oracle10g中自動遞增了我的表,但ID是無序的