Oracle Database 18c の新機能である SEQUENCE のリセット機能を試してみました。
SEQUENCE オブジェクト
SEQUENCE オブジェクト(日本語マニュアルでは「順序」)は、一意な数値を生成するスキーマ・オブジェクトです。CREATE SEQUENCE 文を使って作成します(作成には CREATE SEQUENCE システム権限が必要です)。
初期値、増分、上限、数値を再利用するか等の属性を持ちます。新しい数値を生成するには NEXTVAL 疑似列を指定します。現在の値を確認するには CURRVAL 疑似列を指定します。
下記の例は 100 から初めて 2 ずつ増加させる SEQUENCE を作成して、値を取得しています。
SQL> CREATE SEQUENCE seq1 START WITH 100 INCREMENT BY 2;
Sequence created.
SQL> SELECT seq1.NEXTVAL FROM DUAL;
NEXTVAL
----------
100
SQL> SELECT seq1.NEXTVAL FROM DUAL;
NEXTVAL
----------
102
SQL> SELECT seq1.CURRVAL FROM DUAL;
CURRVAL
----------
102
値のリセット
これまでのバージョンでは、SEQUENCE の生成した値を初期値に戻すことはできず、削除と再作成が必要でした。Oracle Database 18c では、ALTER SEQUENCE RESTART 文を実行することで、SEQUENCE の値を初期値まで戻すことができるようになりました。
不便なことに ALTER SEQUENCE RESTART 文は、作成時に実行した CREATE SEQUENCE 文の START WITH 句を無視します。このため、単純に RESTART 句を指定するだけだと START WITH 句のデフォルト値 1 から値が開始されます。開始数値を変更したい場合は ALTER SEQUENCE 文に RESTART 句と START WITH 句を両方指定する必要があります。
SQL> SELECT seq1.NEXTVAL FROM DUAL;
NEXTVAL
----------
104
SQL> ALTER SEQUENCE seq1 RESTART;
Sequence altered.
SQL> SELECT seq1.NEXTVAL FROM DUAL;
NEXTVAL
----------
1
SQL> ALTER SEQUENCE seq1 RESTART START WITH 100;
Sequence altered.
SQL> SELECT seq1.NEXTVAL FROM DUAL;
NEXTVAL
----------
100
マニュアル上の記載
実はこの新機能は、マニュアル [SQL言語リファレンス] (https://docs.oracle.com/cd/E96517_01/sqlrf/ALTER-SEQUENCE.html#GUID-A6468B63-E7C9-4EF0-B048-82FE2449B26D "SQL言語リファレンス") には構文が記載されていません (2018年8月21日現在)。
SEQUENCE の値を戻す方法については、以下のように記載されています。
日本語版マニュアル
異なる順序番号で再開する場合、順序を削除して再作成する必要があります。
英語版マニュアル
To restart the sequence at a different number, you must drop and re-create it.
しかし、別のマニュアル「データベース管理者ガイド」には、新機能として記載されていますし、[実行例] (https://docs.oracle.com/cd/E96517_01/admin/managing-views-sequences-and-synonyms.html#GUID-5ABC0615-BE0C-48CE-BD18-C86AAF7DF953) も「24.23 順序の変更」に記載されています。修正されることを望みます。