シーケンスとは、データベースが一定のルールに基づいて生成する自動インクリメント型の数値列です。その自動インクリメント特性から、通常は主キーや一意キーとして使用されます。本記事では、シーケンスの値の取得方法、適用シナリオ、および使用方法について説明します。
シーケンスの値の取得方法
次の疑似列を使用して、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ステートメント。別の
SELECTステートメントとUNION、INTERSECT、またはMINUS集合演算子で結合された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回参照するごとに、シーケンスの値が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; /*何度実行してもシーケンス番号は変わりません*/