シーケンス操作関数
このセクションでは、シーケンスジェネレーターまたは単にシーケンスとも呼ばれるシーケンスオブジェクトを操作する関数について説明します。シーケンスオブジェクトは、CREATE SEQUENCE で作成された特殊な単一行のテーブルです。シーケンスオブジェクトは、通常、テーブルの行の一意の識別子を生成するために使用されます。シーケンス関数は、シーケンスオブジェクトから連続するシーケンス値を取得するためのシンプルでマルチユーザーセーフなメソッドを提供します。
重要
シーケンスを使用する場合は、キャッシュ値を慎重に検討する必要があります。詳細については、「CREATE SEQUENCE」ページの重要なコールアウトを参照してください。
ワークロードパターンに基づいてシーケンスを使用する最適な方法のガイダンスについては、「シーケンスと ID 列の使用」を参照してください。
| 関数 | 説明 |
|---|---|
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_called を true または false のいずれかに設定できます。true は 2 つのパラメータフォームと同じ効果があります。false に設定すると、次の nextval は指定された値を正確に返し、シーケンスの進行は次の nextval から開始されます。なお、currval によって報告された値はここでは変更されません。例えば、次のようになります。
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 呼び出しの実行を含め、挿入されるタプルを計算します。したがって、Aurora DSQL のシーケンスオブジェクトは、「ギャップのない」シーケンスを取得するために使用できません。
同様に、setval によって行われたシーケンス状態の変更は、他のトランザクションにすぐに表示され、呼び出し元のトランザクションがロールバックされても元に戻されません。
シーケンス関数によって操作されるシーケンスは、regclass 引数によって指定されます。これは単に pg_class システムカタログ内のシーケンスの OID です。ただし、regclass データ型の入力コンバーターが処理を行うため、OID を手動で検索する必要はありません。詳細については、オブジェクト識別子型