シーケンス(Sequence)とは、データベースが一定のルールに従って生成する自動インクリメントの数値シーケンスです。この自動インクリメント機能により、主キーや一意キーとして利用されることが一般的です。本記事では、シーケンスの値の取得方法、適用シナリオ、および使用方法について説明します。
シーケンスの値の取得方法
SQL文内でシーケンスの値を参照するには、以下の疑似列を使用できます:
CURRVAL:シーケンスの現在の値を返します。NEXTVAL:シーケンスの次の自己増分値を返します。
シーケンス疑似列を使用する場合、CURRVAL と NEXTVAL の前にはシーケンス名を付け、ピリオド(.)で参照する必要があります。例えば、シーケンス名が SEQ_FOO の場合、SEQ_FOO.CURRVAL で SEQ_FOO シーケンスの現在の値を取得できます。同様に、SEQ_FOO.NEXTVAL で SEQ_FOO シーケンスの次の自己増分値を取得できます。
シーケンス値の適用シナリオ
CURRVAL および NEXTVAL で参照されるシーケンス値は、以下の場所で使用できます:
非サブクエリまたはビュー内の
SELECT文の選択リスト内。INSERT文内のサブクエリの選択リスト内。INSERT文内のVALUE句内。UPDATE文内のSET句内。
シーケンスの CURRVAL および NEXTVAL の値は、以下の場所では使用できません:
DELETE、SELECTまたはUPDATE文のサブクエリ内。ビューのクエリ内。
DISTINCT演算子を含むSELECT文内。GROUP BY句またはORDER BY句を含むSELECT文内。UNION、INTERSECTまたはMINUS集合演算子で別のSELECT文と結合されたSELECT文内。SELECT文のWHERE句内。CHECK制約の条件内。
シーケンスの使用方法
シーケンスを作成する際には、初期値とステップサイズを明確に指定する必要があります。NEXTVAL を初めて参照すると、シーケンスの初期値が返されます。その後の NEXTVAL の参照では、前回のシーケンスの戻り値にシーケンス定義のステップサイズを加算した新しい値が返されます。CURRVAL を参照すると、常にシーケンスの現在の値、つまり最後に NEXTVAL が返した値が返されます。
セッション内でシーケンスの CURRVAL を参照する前に、まずそのセッションのシーケンス値を初期化するために、シーケンスの NEXTVAL を適用する必要があります。
シーケンスを作成する際に、初期値と値の間の増分を定義できます。NEXTVAL への最初の参照は、シーケンスの初期値を返します。その後の NEXTVAL の参照は、定義された増分だけシーケンス値を増加させ、新しい値を返します。CURRVAL への参照は常に、そのシーケンスの現在の値、つまり最後に NEXTVAL が返した値を返します。シーケンスの作成に関する詳細は、CREATE SEQUENCEを参照してください。
単一のSQL文で NEXTVAL を参照する場合、OceanBaseデータベースは以下のようにシーケンスをインクリメントします:
SELECT文の外部クエリブロックが各行を返すごとに、シーケンスは1回インクリメントされます。この種のクエリブロックは、以下の場所に現れることがあります:- トップレベルの
SELECT文。 INSERT... SELECT文。複数テーブルへの挿入操作では、NEXTVALはVALUES句内に配置する必要があります。サブクエリが各行を返すごとにシーケンスは1回インクリメントされます。複数のブランチがNEXTVALを参照しても同様です。CREATE TABLE ... AS SELECT文。CREATE MATERIALIZED VIEW ... AS SELECT文。
- トップレベルの
UPDATE文は、各行を更新するごとにシーケンスを1回インクリメントします。VALUES句を含むINSERT文が1文あるごとに、シーケンスは1回インクリメントされます。注意
OceanBaseデータベースV4.3.x系では、V4.3.1バージョン以降、シーケンスのインクリメント動作が変更されました。
INSERT文内でシーケンスが参照されるたびに、シーケンスの値が1回インクリメントされます。シーケンス値を参照せずに列に手動で値を挿入した場合、シーケンスの値は変更されません。MERGE文は、各行をマージするごとにシーケンスを1回インクリメントします。NEXTVALはmerge_insert_clauseまたはmerge_update_clause句に記述するか、両方に記述することができます。NEXTVALは、各行の更新や挿入に使用されなくても、それぞれの更新や挿入ごとにインクリメントされます。これらの箇所でNEXTVALが複数回指定されている場合、各行ごとにシーケンスが1回インクリメントされ、その行内に現れるすべてのNEXTVALは同じ値を返します。
これらの箇所でシーケンスの NEXTVAL が複数回参照される場合、そのシーケンスは1回だけインクリメントされ、すべての参照先の NEXTVAL にはシーケンスの次の値が返されます。
これらの箇所でシーケンスの CURRVAL と NEXTVAL が同時に参照される場合、OceanBaseデータベースはそのシーケンスをインクリメントし、参照された CURRVAL と NEXTVAL にはどちらもシーケンスの次の値が返されます。
シーケンスは複数のユーザーが同時にアクセスでき、待機やロックは発生しません。 シーケンスを個別にクエリする例を以下に示します:
SELECT SEQUENCE_NAME.NEXTVAL FROM DUAL; /*実行するたびにシーケンス番号が増加します*/
SELECT SEQUENCE_NAME.CURRVAL FROM DUAL; /*何度実行してもシーケンス番号は変わりません*/