シーケンス操作関数

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

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

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

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

関数 | 戻り値 | 説明
--- | --- | ---
``currval(`regclass`)`` | `bigint` | 指定されたシーケンスに対し`nextval`で得られた最新の値を返す
``lastval()`` | `bigint` | どんなシーケンスに対してでも`nextval`により最も最近取得された値を返す
``nextval(`regclass`)`` | `bigint` | シーケンスを進め、新しい値を返す
``setval(`regclass`, `bigint`)`` | `bigint` | シーケンスの現在値を設定する
``setval(`regclass`, `bigint`, `boolean`)`` | `bigint` | シーケンスの現在値と`is_called`フラグを設定する

シーケンス関数により操作されるシーケンスは`regclass`引数で指定され、そしてそれは`pg_class`システムカタログ内のシーケンスのOIDに過ぎません。手作業でOIDを検索してはいけませんが、`regclass`データ型の入力変換器が代わってその作業を行ってくれます。リテラル関数のように見えるするようにするため、単一引用符で括られたシーケンス名を記述するだけです。通常の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

`regclass`に関してのより詳細な情報は項8.16を参照してください。

> 注意: PostgreSQL 8.1以前においては、シーケンス関数の引数は`regclass`型ではなく、`text`型で、そして上記のテキスト文字列からOID値への変換はそれぞれの呼び出し実行時に起こりました。後方互換性のため、この仕組みはまだ存在しますが、内部的には関数が実行される前に`text`から`regclass`への暗黙的強制型変換として現在処理されています。

> ありのままのリテラル文字列としてシーケンス関数の引数を記述する時は、`regclass`データ型の定数になります。これは単にOIDなので、後で名前付けが再び行われたとか、スキーマの再割り振りとかに係わらず、最初に特定されたシーケンスを引き継ぎます。この"初期束縛"の動作は、通常列のデフォルトとビュー参照するシーケンスにとって魅力があります。しかし、たまには実行時にシーケンス参照が解決されるような"動的束縛"が望まれます。動的束縛の動作を得るには、定数を`regclass`ではなく`text`定数としてその定数を保存させます。

>     nextval('foo'::text)      foo is looked up at runtime

> 動的束縛はPostgreSQLのリリース8.1以前でサポートされた動作であったので、旧来のアプリケーションのセマンティクスを保ちたい場合このようにする必要があるかもしれません。

> もちろん、シーケンス関数の引数は定数とともに、評価式であることも可能です。もしテキスト式の場合は暗黙的強制型変換が実行時検索に用いられます。

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

`nextval`

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

`currval`

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

`lastval`

  現在のセッションの`nextval`で戻される最新の値を返します。この関数は、現在のセッションの中で`nextval`によって使用される最後のシーケンスの値をフェッチする引数としてのシーケンス名を取ることを除いて、`currval`と同等です。現在のセッションで`nextval`が未だ呼ばれていなければエラーになります。

`setval`

  シーケンスオブジェクトの計数値をリセットします。２つのパラメータを所有する形式では、シーケンスの`last_value`フィールドを指定された値に設定し、`is_called`フィールドを`true`（真）に設定します。この意味は、次の`nextval`が値を返す前にシーケンスを進めるということです。`currval`で報告された値も指定された値に設定されます。３パラメータ形式の場合、`is_called`を`true`（真）もしくは`false`（偽）に設定することができます。`true`（真）は２パラメータ形式と同じ効果があります。`false`（偽）に設定された場合、次の`nextval`が指定された正確な値を返し、シーケンスの進行は引き続く`nextval`から始まります。さらにこの場合（これは8.3以前の動作からの変更）、`currval`で報告された値は変更されません。例えば、次の例です。

      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番目の引数の値です。

デフォルトのパラメータによってシーケンスオブジェクトが作成されているなら、引き続く`nextval`呼び出しは１から始まる連続的な値を返します。その他の動作をCREATE SEQUENCEコマンドの特別なパラメータを使用してさせることが可能です。より詳しくはコマンドのリファレンスガイドを参照ください。

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

前のページ | ホーム | 次のページ
XML関数 | 上に戻る | 条件式