2014-12-19 44 views
2

我的要求如下。 (a)我已經創建了序列,一張表是(讓我們假設員工有id,name ..等等)。 (b)一些如何破壞我的序列,並且當前序列的值與僱員表的id列的最大值不同步。如何更改db序列起始值


現在我想將我的序列重置爲employee表的id列的最大值。我知道我們可以通過使用PL/SQL,Stored Procedure輕鬆完成。但我想寫一個簡單的查詢,它將執行以下任務。 1-獲取id的最大值和我序列的當前值。取一個差值,並通過使用increment by。(這裏我當前的序列值小於id列的最大id值)將差值加到序列上

+0

取決於您使用哪個數據庫管理系統,sqlserver,mysql或其他? – Pseudonym

+0

您想重置一次或在每次插入記錄時查找最大的ID? –

+0

@由於OP詢問[tag:plsql],所以假設他的意思是[tag:oracle]是安全的。 – Mureinik

回答

0

由於alter sequence是DDL,所以無法更改普通SQL的增量,因此您需要逐個增加多次。這將增加序列多次,您目前擁有的最高ID:

select your_sequence.nextval 
from (
    select max(id) as max_id 
    from your_table 
) t 
connect by level < t.max_id; 

SQL Fiddle demo(捏造有點彷彿架構緩存序列不復位)。

如果你有很高的價值,雖然這可能是低效的,但作爲一次性調整可能無關緊要。您無法引用子查詢或CTE中的當前序列值,但您可以查看USER_SEQUNECES視圖,以獲取有關您開始時的距離的粗略指導,並將呼叫數量減少到兩倍以內大小(取決於緩存保存多少等待值):

select your_sequence.nextval 
from (
    select max(id) as max_id 
    from your_table 
) t 
connect by level <= (
    select t.max_id + us.cache_size + 1 - us.last_number 
    from user_sequences us 
    where sequence_name = 'YOUR_SEQUENCE' 
); 

SQL Fiddle

由於現有ID值較低,第二個可能會做更多的工作,但如果值較高,則可以看到第二個進入自己的位置。

+0

謝謝你的回覆,但我有以下問題,而使用這種方法。 1-在第一種方法中,問題發生如下(例如:當前seq。當前值= 12,最大id = 20。理想情況下它應該設置當前值= 20,但根據分析發現,作爲級別值開始於1如此條件(1 <20)插入2o順序記錄和此方法失敗 2-在第二,我可以更新只有單個值,我可以通過seq.next val簡單做(注意:如果我們可以設置級別值= 12 [seq當前值然後這將成功]) 高級謝謝! –

+0

@SaurabhGupta - 想要將序列設置爲20意味着你不想在你的ID中出現空缺,但序列無論如何都不是無縫隙的,所以我不確定爲什麼'失敗'。在這兩種情況下,序列的結果可能會高於舊的最大ID(可能在第一個版本中要高得多;在第二個版本中可能要高得多),而在第二個版本中cache_size可能會更高。使用這些值時,第一個結果爲30,第二個結果爲31,第二個結果爲31.不清楚'我只能更新單個值'的含義,因爲nextval仍然被connect-by多次調用。 –

+0

1-讓我們舉一個例子 Seq.currval = 12 Max(id)= 20 現在,如果我繼續第一種方法,那麼我們已經指定條件爲通過級別連接