6.11. シーケンス操作関数

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

Table 6-26. シーケンス関数

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

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

nextval('foo')      operates on sequence foo
nextval('FOO')      operates on sequence foo
nextval('"Foo"')    operates on sequence Foo

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

nextval('myschema.foo')     operates on myschema.foo
nextval('"myschema".foo')   same as above
nextval('foo')              searches search path for 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);           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 コマンド内で特別なパラメータを使用してこの他の振舞いをさせることができます。 詳しくはコマンドのリファレンスガイドを参照ください。