Table 4-24. シーケンス関数
関数 | 返り値 | 説明 |
---|---|---|
nextval(text) | bigint | シーケンスを進め新規返り値を戻す |
currval(text) | bigint | nextval で得られた直近の返り値 |
setval(text,bigint) | bigint | シーケンスの現在値を設定 |
setval(text,bigint,boolean) | bigint | シーケンスの現在値と is_called フラグを設定 |
この節では PostgreSQL の シーケンスオブジェクトの対し演算を行なう関数に付いて説明します。シーケンスオブジェクト(シーケンス生成器とも単にシーケンスとも呼ばれます)とは CREATE SEQUENCE コマンドで作成される1 行の特別なテーブルです。シーケンスオブジェクトは通常テーブルの行に一意の識別子を生成するために使用されます。シーケンス関数はシーケンスオブジェクトから連続したシーケンス値を取得するための簡易でマルチユーザーに対応したメソッドです。
ほぼ歴史的な理由によって、シーケンス関数呼出により演算されるシーケンスはテキスト文字列引数で指定されます。通常の SQL の名称での操作と互換性をとるため、シーケンス関数は文字列が二重引用符で括られている以外引数を小文字に変換します。よって、以下のようになります。
nextval('foo') operates on sequence foo nextval('FOO') operates on sequence foo nextval('"Foo"') operates on sequence Foo
もちろん、単純なリテラルのみならずテキスト引数も評価式の結果になり得ます。時として便利なことがあります。
使用できるシーケンス関数には以下のものがあります。
シーケンスオブジェクトをその次の値に進めその値を返します。これは自動的に処理されます。複数のサーバプロセスが同時に nextval を実行したとしても、それぞれの工程は個別のシーケンス値を間違いなく受け取ります。
現在のサーバプロセスにおいてそのシーケンスから nextval によって取得された直近の値を返します。(プロセス内でシーケンスに対し nextval が呼ばれていない場合にはエラーが報告されます。)これはローカルのプロセス値を返すことから、その時点で別のサーバプロセスが nextval を実行していたとしても予想に違わない回答をもたらすことに注意してください。
シーケンスオブジェクトの計数値をリセットします。2 つのパラメータを所有する形式でシーケンスの last_value フィールドを指定された値に設定し、is_called フィールドを true (真)に設定します。この意味は、次の nextval が値を返す前にシーケンスを進めるということです。3 つのパラメータ形式の場合、 is_called は true (真) もしくは false(偽) に設定されます。false (偽) に設定された場合、次の nextval が指定された正確な値を返し、シーケンスの進行は引き続く nextval から始まります。例えば、次のようになります。
SELECT setval('foo', 42); Next nextval() will return 43 SELECT setval('foo', 42, true); Same as above SELECT setval('foo', 42, false); Next nextval() will return 42
setval によって返される結果は単にその第 2 番目の引数の値です。
Important: 同一のシーケンスから数値を取得する同時実行トランザクション同士のブロッキングを防止するため、nextval 演算は決してロールバックされません。と言うことは、たとえ nextval を実行したトランザクションが後にアボートしたとしても、値がひと度フェッチされたらそれは使用されたと考えます。この意味はアボートされたトランザクションは割り当てられた値のシーケンス内に未使用の "hole (欠損)"を残す可能性があります。いずれにしても setval 演算は決してロールバックしません。
もしシーケンスオブジェクトがデフォルトのパラメータで作成されていれば、そのシーケンスオブジェクト上の nextval() 呼び出しは 1 で始まる連続値を返すことになります。 CREATE SEQUENCE コマンド内で特別なパラメータを使用してこの他の振舞いをさせることができます。詳しくはコマンドのリファレンスガイドを参照ください。