すべてのプロダクト
Search
ドキュメントセンター

PolarDB:シーケンス操作関数

最終更新日:May 31, 2024

このセクションでは、シーケンスジェネレータまたは単にシーケンスとも呼ばれるシーケンスオブジェクトを操作するための関数について説明します。 シーケンスオブジェクトは、CREATE Sequenceで作成された特殊な単一行テーブルです。 シーケンスオブジェクトは通常、テーブルの行の一意の識別子を生成するために使用されます。 シーケンス関数は、シーケンスオブジェクトから連続するシーケンス値を取得するための単純なマルチユーザーセーフな方法を提供します。

シーケンス関数

nextval (regclass) → bigint

シーケンスオブジェクトを次の値に進め、その値を返します。 これはアトミックに行われます。複数のセッションがnextvalを同時に実行しても、それぞれが個別のシーケンス値を安全に受け取ります。 シーケンスオブジェクトが既定のパラメーターで作成されている場合、nextval呼び出しは1で始まる連続した値を返します。 その他の動作は、CREATE SEQUENCEコマンドの適切なパラメータを使用して取得できます。

この関数には、シーケンスに対するUSAGEまたはUPDATE権限が必要です。

setval (regclass, bigint [, boolean] ) → bigint

シーケンスオブジェクトの現在の値を設定し、オプションでis_calledフラグを設定します。 2パラメーターフォームは、シーケンスのlast_valueフィールドを指定された値に設定し、is_calledフィールドをtrueに設定します。これは、次のnextvalが値を返す前にシーケンスを進めることを意味します。 currvalによって報告される値も指定された値に設定されます。 3パラメーター形式では、is_calledtrueまたはfalseに設定できます。trueは、2パラメーター形式と同じ効果があります。 falseに設定されている場合、次のnextvalは指定された値を正確に返し、シーケンスの進行は次のnextvalで始まります。 さらに、この場合、currvalによって報告される値は変更されない。 たとえば、

SELECT setval('myseq' 、42); 次のnextvalは43を返します
SELECT setval('myseq', 42, true); 上記と同じ
SELECT setval('myseq', 42, false); 次のnextvalは42を返します

setvalによって返される結果は、2番目の引数の値にすぎません。

この関数には、シーケンスに対するUPDATE権限が必要です。

currval (regclass) → bigint

現在のセッションでこのシーケンスのnextvalによって最近取得された値を返します。 (このセッションでこのシーケンスに対してnextvalが呼び出されたことがない場合、エラーが報告されます。) これはセッションローカル値を返すため、現在のセッションが実行してから他のセッションがnextvalを実行したかどうかを予測可能に答えます。

この関数には、シーケンスに対するUSAGEまたはSELECT権限が必要です。

lastval () → bigint

現在のセッションでnextvalによって最後に返された値を返します。 この関数はcurrvalと同じですが、シーケンス名を引数とする代わりに、現在のセッションで最後に適用されたシーケンスnextvalを参照します。 現在のセッションでnextvalがまだ呼び出されていない場合、lastvalを呼び出すのはエラーです。

この関数には、最後に使用したシーケンスに対してUSAGEまたはSELECT権限が必要です。

同じシーケンスから番号を取得する同時トランザクションのブロックを回避するために、nextvalによって取得された値は、呼び出し側トランザクションが後でアボートした場合に再利用のために再利用されません。 つまり、トランザクションのアボートやデータベースのクラッシュにより、割り当てられた値のシーケンスにギャップが生じる可能性があります。 これは、トランザクションの中止なしでも発生する可能性があります。 たとえば、ON CONFLICT句を持つINSERTは、代わりにON conflictルールに従わせる競合を検出する前に、必要なnextval呼び出しを行うことを含め、挿入されるタプルを計算します。 したがって、PostgreSQLsequenceオブジェクトを使用して「ギャップレス」シーケンスを取得することはできません

同様に、setvalによって行われたシーケンス状態の変更は、他のトランザクションにすぐに表示され、呼び出し側トランザクションがロールバックしても取り消されません。

シーケンス関数によって操作されるシーケンスは、regclass引数によって指定されます。これは、単にpg_classシステムカタログ内のシーケンスのOIDです。 ただし、regclassデータ型の入力コンバーターが作業を行うため、OIDを手動で調べる必要はありません。 シーケンス名を一重引用符で囲むだけで、リテラル定数のように見えます。 通常のSQL名の処理との互換性のために、シーケンス名の周りに二重引用符が含まれていない限り、文字列は小文字に変換されます。 したがって:

nextval('foo') に対するfoo
    nextval('FOO') fooに対する
    nextval('"Foo"') 従属Foo 

シーケンス名は、必要に応じてパターン修飾できます。

nextval('myschema.foo') に対するmyschema.foo
    nextval('"myschema".foo')
    nextval('foo') 監修中心foo 

このデータベースのバージョン8.1以前は、シーケンス関数のパラメータタイプはregclassではなくtextであり、前述のテキスト文字列からOID値への変換は各呼び出しで発生します。 下位互換性のために、この処理はまだ存在しますが、内部的には、関数呼び出しの前にtextregclassに暗黙的に変換することによって実装されます。

シーケンス関数のパラメーターを変更しないリテラル文字列として記述すると、regclass型の定数になります。 これは単なるOIDであるため、その後の名前の変更、スキーマの変更などに関係なく、最初に識別されたシーケンスを追跡します。 この「初期バインディング」動作は、ビューで参照される列のデフォルトおよびシーケンスに望ましいことがよくあります。 しかし、シーケンスへの参照が実行時に解決される「レイジーバインディング」が必要な場合があります。 遅延バインディング動作を取得するには、定数をregclassesではなくtext定数として強制的に格納します。

nextval('foo'::text) fooは実行時に検索されます

遅延バインディングは、このデータベースのバージョン8.1より前にサポートされている唯一の動作であるため、古いアプリケーションのセマンティクスを維持するためにこれを行う必要がある場合があります。

もちろん、シーケンス関数のパラメータは式であってもよい。 テキスト式の場合、暗黙的な変換は実行時のルックアップを引き起こします。