

# シーケンス操作関数
<a name="sequence-functions-syntax-support"></a>

このセクションでは、シーケンスジェネレーターまたは単にシーケンスとも呼ばれるシーケンスオブジェクトを操作する関数について説明します。シーケンスオブジェクトは、[`CREATE SEQUENCE`](create-sequence-syntax-support.md) で作成された特殊な単一行のテーブルです。シーケンスオブジェクトは、通常、テーブルの行の一意の識別子を生成するために使用されます。シーケンス関数は、シーケンスオブジェクトから連続するシーケンス値を取得するためのシンプルでマルチユーザーセーフなメソッドを提供します。

**重要**  
シーケンスを使用する場合は、キャッシュ値を慎重に検討する必要があります。詳細については、「[`CREATE SEQUENCE`](create-sequence-syntax-support.md)」ページの重要なコールアウトを参照してください。  
ワークロードパターンに基づいてシーケンスを使用する最適な方法のガイダンスについては、「[シーケンスと ID 列の使用](sequences-identity-columns-working-with.md)」を参照してください。


| 関数 | 説明 | 
| --- | --- | 
| nextval ( regclass ) → bigint | シーケンスオブジェクトを次の値に進め、その値を返します。これはアトミックに実行されます。複数のセッションが同時に nextval を実行しても、各セッションは個別のシーケンス値を安全に受け取ります。シーケンスオブジェクトがデフォルトのパラメータで作成されている場合、連続する nextval 呼び出しでは 1 から始まる増加する値が返されます。その他の動作は、[`CREATE SEQUENCE`](create-sequence-syntax-support.md) コマンドで適切なパラメータを使用して実現できます。この関数には、シーケンスに対する USAGE または UPDATE 権限が必要です。 | 
| setval ( regclass, bigint [, boolean ] ) → bigint | シーケンスオブジェクトの現在の値を設定し、オプションでその is\$1called フラグを設定します。2 つのパラメータフォームでは、シーケンスの last\$1value フィールドが指定された値に設定され、その is\$1called フィールドが true に設定されます。つまり、次の nextval は値を返す前にシーケンスを進めます。currval によって報告される値も、指定された値に設定されます。3 つのパラメータフォームでは、is\$1called を true または false のいずれかに設定できます。true は 2 つのパラメータフォームと同じ効果があります。false に設定すると、次の nextval は指定された値を正確に返し、シーケンスの進行は次の nextval から開始されます。なお、currval によって報告された値はここでは変更されません。例えば、次のようになります。<pre>SELECT setval('myseq', 42);           -- Next nextval will return 43<br />SELECT setval('myseq', 42, true);     -- Same as above<br />SELECT setval('myseq', 42, false);    -- Next nextval will return 42</pre> 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 を手動で検索する必要はありません。詳細については、[オブジェクト識別子型](https://www.postgresql.org/docs/current/datatype-oid.html)に関する PostgreSQL ドキュメントを参照してください。