シーケンス操作関数

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 9章関数と演算子 | 早送り | 次のページ

# 9.12. シーケンス操作関数

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

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

関数 | 戻り値 | 説明
--- | --- | ---
``nextval`(`text`)` | `bigint` | シーケンスを進め、新規戻り値を戻す
``currval`(`text`)` | `bigint` | `nextval`で得られた直近の値を返す
``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_called`を`true`(真)もしくは`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コマンド内で特別なパラメータを使用してこの他の振舞いをさせることができます。 詳しくはコマンドのリファレンスガイドを参照ください。

前のページ | ホーム | 次のページ
ネットワークアドレス型関数と演算子 | 上に戻る | 条件式