9.11. シーケンス操作関数

この節ではPostgreSQLシーケンスオブジェクトに対し演算を行なう関数について説明します。 シーケンスオブジェクト(シーケンス生成器とも単にシーケンスとも呼ばれます)とはCREATE SEQUENCEコマンドで作成される1行の特別なテーブルです。 シーケンスオブジェクトは通常テーブルの行に一意の識別子を生成するために使用されます。 表9-34に列挙されているシーケンス関数は、シーケンスオブジェクトから連続したシーケンス値を取得するための、簡易でマルチユーザに対応した関数です。

表 9-34. シーケンス関数

関数返り値説明
nextval(text)bigintシーケンスを進め、新規返り値を戻す
currval(text)bigintnextvalで得られた直近の値を返す
setval(text, bigint)bigintシーケンスの現在値を設定する
setval(text, bigint, boolean)bigintシーケンスの現在値とis_calledフラグを設定する

ほぼ歴史的な理由によって、シーケンス関数呼出により演算されるシーケンスはテキスト文字列引数で指定されます。 通常のSQLの名称での操作と互換性をとるため、シーケンス関数は文字列が二重引用符で括られている以外引数を小文字に変換します。 よって、以下のようになります。

nextval('foo')      fooシーケンスを操作
nextval('FOO')      fooシーケンスを操作
nextval('"Foo"')    Fooシーケンスを操作

必要であれば、以下のようにシーケンス名をスキーマで修飾することができます。

nextval('myschema.foo')     myschema.fooを操作
nextval('"myschema".foo')   同上
nextval('foo')              foo用にパスを検索

もちろん、単純なリテラルのみならずテキスト引数も評価式の結果になり得ます。 時として便利なことがあります。

使用できるシーケンス関数には以下のものがあります。

nextval

シーケンスオブジェクトをその次の値に進め、その値を返します。 これは自動的に処理されます。 複数のセッションが同時にnextvalを実行したとしても、それぞれのセッションは個別のシーケンス値を間違いなく受け取ります。

currval

現在のセッションにおいて、そのシーケンスからnextvalによって取得された直近の値を返します。 (セッション内でそのシーケンスに対しnextvalが呼ばれていない場合には、エラーが報告されます。) これはローカルのセッション値を返すことから、その時点で別のセッションがnextvalを実行していたとしても、予想に違わない回答をもたらすことに注意してください。

setval

シーケンスオブジェクトの計数値をリセットします。 2つのパラメータを所有する形式では、シーケンスのlast_valueフィールドを指定された値に設定し、is_calledフィールドをtrue(真)に設定します。 この意味は、次のnextvalが値を返す前にシーケンスを進めるということです。 3つのパラメータ形式の場合、is_calledtrue(真)もしくはfalse(偽)に設定することができます。 false(偽)に設定された場合、次のnextvalが指定された正確な値を返し、シーケンスの進行は引き続くnextvalから始まります。 たとえば、次の例です。

SELECT setval('foo', 42);           次回のnextvalは43を返す
SELECT setval('foo', 42, true);     同上
SELECT setval('foo', 42, false);    次回のnextvalは42を返す

setvalによって返される結果は単にその第2番目の引数の値です。

重要項目: 同一のシーケンスから数値を取得する同時実行トランザクション同士のブロックを防止するため、nextval演算は決してロールバックされません。 と言うことは、たとえnextvalを実行したトランザクションが後にアボートしたとしても、値が一度取り出されたらそれは使用されたものと考えます。 この意味はアボートされたトランザクションは割り当てられた値のシーケンス内に未使用の"欠損"を残す可能性があります。 いずれにしてもsetval演算は決してロールバックしません。

もしシーケンスオブジェクトがデフォルトのパラメータで作成されていれば、そのシーケンスオブジェクト上のnextval()呼び出しは1で始まる連続値を返すことになります。 CREATE SEQUENCEコマンド内で特別なパラメータを使用してこの他の振舞いをさせることができます。 詳しくはコマンドのリファレンスガイドを参照ください。