このセクションでは、シーケンスジェネレータまたは単にシーケンスとも呼ばれるシーケンスオブジェクトを操作するための関数について説明します。 シーケンスオブジェクトは、CREATE Sequenceで作成された特殊な単一行テーブルです。 シーケンスオブジェクトは通常、テーブルの行の一意の識別子を生成するために使用されます。 シーケンス関数は、シーケンスオブジェクトから連続するシーケンス値を取得するための単純なマルチユーザーセーフな方法を提供します。
シーケンス関数
シーケンスオブジェクトを次の値に進め、その値を返します。 これはアトミックに行われます。複数のセッションが この関数には、シーケンスに対する |
シーケンスオブジェクトの現在の値を設定し、オプションで
この関数には、シーケンスに対する |
現在のセッションでこのシーケンスの この関数には、シーケンスに対する |
現在のセッションで この関数には、最後に使用したシーケンスに対して |
同じシーケンスから番号を取得する同時トランザクションのブロックを回避するために、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値への変換は各呼び出しで発生します。 下位互換性のために、この処理はまだ存在しますが、内部的には、関数呼び出しの前にtextをregclassに暗黙的に変換することによって実装されます。
シーケンス関数のパラメーターを変更しないリテラル文字列として記述すると、regclass型の定数になります。 これは単なるOIDであるため、その後の名前の変更、スキーマの変更などに関係なく、最初に識別されたシーケンスを追跡します。 この「初期バインディング」動作は、ビューで参照される列のデフォルトおよびシーケンスに望ましいことがよくあります。 しかし、シーケンスへの参照が実行時に解決される「レイジーバインディング」が必要な場合があります。 遅延バインディング動作を取得するには、定数をregclassesではなくtext定数として強制的に格納します。
nextval('foo'::text) fooは実行時に検索されます遅延バインディングは、このデータベースのバージョン8.1より前にサポートされている唯一の動作であるため、古いアプリケーションのセマンティクスを維持するためにこれを行う必要がある場合があります。
もちろん、シーケンス関数のパラメータは式であってもよい。 テキスト式の場合、暗黙的な変換は実行時のルックアップを引き起こします。