無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

9.16. シーケンス操作関数

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

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

関数 戻り値 説明
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.18 を参照してください。

注意: 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 を実行したとしても、それぞれのセッションは個別のシーケンス値を間違いなく受け取ります。

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

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

currval

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

lastval

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

setval

シーケンスオブジェクトの計数値をリセットします。2つのパラメータを所有する形式では、シーケンスの last_value フィールドを指定された値に設定し、 is_called フィールドを true (真)に設定します。この意味は、次の nextval が値を返す前にシーケンスを進めるということです。 currval で報告された値も指定された値に設定されます。3パラメータ形式の場合、 is_called true (真)もしくは false (偽)に設定することができます。 true (真)は2パラメータ形式と同じ効果があります。 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番目の引数の値です。

重要項目: シーケンスは非トランザクショナルに扱われるため、 setval による変更は、そのトランザクションがロールバックされたとしても 元に戻りません。


powered by SEO.CUG.NET