シーケンス(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; /*何度実行してもシーケンス番号は変わりません*/