修改 Oracle Sequence

不同於 MySQL 非常方便的 Auto Increment,Oracle 中必須自己建立及管理 Sequence 來記錄目前 Table 的序號,這篇文章記錄如何透過指令修改 Oracle Sequence。

小蛙需要修改一個既有的 Sequence,之前差一些些的話,可以偷懶直接透過 .nextval 取得下一個 sequence 達到調整的效果

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT XXX_SEQ.nextval FROM DUAL;
SELECT XXX_SEQ.nextval FROM DUAL;
SELECT XXX_SEQ.nextval FROM DUAL;

但這次要調整三萬多個序號就沒辦法這樣做了,透過 Oracle SQL Developer 修改的話又跳出嚇人的警告畫面,因此還是乖乖採取保守方式來調整。

修改 INCREMENT

Oracle 的 Sequence 運作會有一個遞增量 (increment),小蛙遇到的狀況需要一次調整 30000,以下指令可以先將該 sequence 的遞增量修改成 30000,也就是每一次觸發 nextval 就會增加 30000。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ALTER SEQUENCE XXX_SEQ INCREMENT BY 30000;
ALTER SEQUENCE XXX_SEQ INCREMENT BY 30000;
ALTER SEQUENCE XXX_SEQ INCREMENT BY 30000;

取得下一個號碼

透過 .nextval 取得下一個號碼,可以發現假設原本序號是 30,遞增量是 1,那 .nextval 就會是 31;我們把遞增量改成 30000 之後,原本序號是 31,取得 .nextval 時就會得到 30031。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT XXX_SEQ.nextval FROM DUAL;
SELECT XXX_SEQ.nextval FROM DUAL;
SELECT XXX_SEQ.nextval FROM DUAL;

恢復 INCREMENT

最後把遞增量改回 1 就完成了。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ALTER SEQUENCE XXX_SEQ INCREMENT BY 1;
ALTER SEQUENCE XXX_SEQ INCREMENT BY 1;
ALTER SEQUENCE XXX_SEQ INCREMENT BY 1;

可以透過以下語法看到目前 Sequence 的 last_number 是多少

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT last_number FROM user_sequences WHERE sequence_name = 'XXX_SEQ';
SELECT last_number FROM user_sequences WHERE sequence_name = 'XXX_SEQ';
SELECT last_number FROM user_sequences WHERE sequence_name = 'XXX_SEQ';

參考資料:修改Oracle Sequence的last numberBest way to reset an Oracle sequence to the next value in an existing column?

與 Oracle 相關的文章

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

    這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料