2014-02-12 23 views
0

我已經在oracle中使用序列和觸發器在我的表上實現了自動遞增。 輸入的前兩個記錄具有連續順序的ID,但在第三個記錄的輸入處存在缺口。 ID是8。在刪除記錄並使新記錄變爲時,ID變爲9. 如何刪除間隙並將第三條記錄的ID作爲3並以連續的順序獲取下一個。 如果一行被刪除,新行將以新序列開始還是繼續從已刪除序列? 我該如何解決這個問題? 請幫忙在Oracle10g for ID的自動遞增中,如果一行被刪除,新行是以新序列開始還是從已刪除序列繼續

回答

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; 
相關問題