CREATE SEQUENCE

Name

CREATE SEQUENCE  -- 新しいシーケンス生成器の定義

Synopsis

CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT increment ]
    [ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
    [ START start ] [ CACHE cache ] [ CYCLE ]
  

入力

TEMPORARY or TEMP

指定された場合、このシーケンスオブジェクトはそのセッション用だけとして作成され、セッション終了時に自動的に削除されます。 一時シーケンスが存在する場合、同じ名前を持つ既存の永続シーケンスはスキーマ修飾された名前で参照されていなければ、(そのセッションでは) 非可視です。

seqname

作成するシーケンスの名前です (スキーマ修飾名でも可)。

increment

省略可能な INCREMENT increment 句は、増加量を設定します。正の値は昇順のシーケンス番号、負の値は降順のシーケンス番号を作成します。設定しない場合のデフォルト値は 1 です

minvalue

省略可能な MINVALUE minvalue 句は、シーケンス番号として作成できる最小の値を決定します。昇順と降順のシーケンスのデフォルト値は、それぞれ 1 と -2^63-1 です。

maxvalue

省略可能な MAXVALUE maxvalue 句は、シーケンス番号の最大値を決定します。昇順と降順のそれぞれのシーケンス番号の最大値のデフォルトは、2^63-1と-1です。

start

省略可能な START start 句によって、シーケンスをどこからでも始めることができます。デフォルトでは、シーケンス番号が始まる値は、昇順の場合 minvalue に、降順の場合 maxvalueになります。

cache

CACHE cache オプションによって、あらかじめシーケンス番号を割り当て、それをメモリに格納しておくことでアクセスを高速にすることができます。最小値は1(これは1回につき1つの値だけを生成します。つまりキャッシュはありません)で、これがデフォルトにもなっています。

CYCLE

オプションのCYCLEキーワードは、昇順、あるいは降順のシーケンス番号が、それぞれmaxvalueまたはminvalueの値に達したときに、シーケンスを元に戻すことを可能にするために使えます。もしシーケンス番号の限界値まで達した場合、次に生成される番号はminvalue または maxvalueのどちらかになります。CYCLE の指定がない場合、制限に達した後の nextval 呼び出しはエラーになります。

出力

CREATE SEQUENCE

コマンドに成功した場合に返されるメッセージです。

ERROR: Relation 'seqname' already exists

指定したシーケンスがすでに存在している場合のメッセージです。

ERROR: DefineSequence:MINVALUE (start) can't be >= MAXVALUE (max)

範囲外の初期値が設定されました(最大値以上の値が設定されました)。

ERROR: DefineSequence:START value (start) can't be < MINVALUE (min)

範囲外の初期値が設定されました(最小値より小さい値が設定されました)。

ERROR: DefineSequence:MINVALUE (min) can't be >= MAXVALUE (max)

最小値、最大値の設定が矛盾しています(最小値が、最大値より大きい値に設定されました)。

説明

CREATE SEQUENCEは、新しいシーケンス番号生成機構を現在のデータベースの中に登録します。これは、seqname という名前を持った一行だけの新しいテーブルの作成と初期化を行います。シーケンス番号生成機構は、このコマンドを実行したユーザによって所有されます。

スキーマ名が与えられている場合、そのシーケンスは指定されたスキーマで作成されます。 スキーマ名がなければ、シーケンスは現在のスキーマ (検索パスの前にあるスキーマ。CURRENT_SCHEMA() 参照) で作成されます。 また、TEMP シーケンスは特別なスキーマに存在するため、TEMP シーケンスの作成時にスキーマ名を与えられない場合もあります。 シーケンス名は、同じスキーマ内の他のシーケンス、テーブル、インデックス、もしくはビューとは異なる名前にする必要があります。

シーケンスを作成した後、nextvalcurrvalsetval 関数を使用してシーケンスを操作します。この関数は ユーザガイド で説明されています。

シーケンスを直接更新することはできませんが、以下のような問い合わせを使用できます。

SELECT * FROM seqname;
   

これを使用すると、シーケンスのパラメータと現在の状態を確認することができます。特に、シーケンスの last_value フィールドは全てのバックエンドプロセスで割り当てられた最後の値を示します。(もちろん、この値は表示された時点で、他のプロセスの nextval の実行により古くなっている場合もあります。)

Caution

もし、複数のバックエンドによって同時に使用される可能性のあるシーケンスオブジェクトに対し、cache 設定が1よりも大きい場合、予想外の結果となることがあります。それぞれのバックエンドはシーケンスオブジェクトにアクセスするたびに連続したシーケンスの値を割り当て、キャッシュし、それに応じてシーケンスオブジェクトの last_value を増やします。次に、そのバックエンドにおける、引き続く cache - 1 回の nextval の使用は共有オブジェクトに触ることなく、事前に割り当てられた値を返します。したがって、割り当てられても、指定されたセッションで使われなかった(シーケンス)番号は破棄されます。 さらに、複数のバックエンドは重複しないシーケンス値が割り当てられることを保証されていますが、その値はすべてのバックエンドを対象にした場合、順列に付いているかは定かでありません。 (たとえば、cache 設定が 10 となっていて、バックエンド A が 1...10 までの値を予約し、nextval=1 を返すとした場合、バックエンド B が 11...20 の値を予約して、バックエンド A が nextval=2 を生成する前に nextval=11 を返すことがあります。)従って、cache設定が 1 の場合、nextval の値は連続的に生成されると想定することは安全ですが、cache 設定が 1 より大きいときは、nextval の値はすべて重複しない値になりますが、それらは純粋に連続的に生成されるというわけではありません。同様に、last_value は、nextval によってどんな値が返されるかということにかかわらず、バックエンドによって一番最近に予約された値を反映しています。もう1つ考慮するべき点は、そのようなシーケンスで実行された setval はキャッシュしている前もって割り当てられた値を使い切るまで他のバックエンドには認識されないということです。

注釈

シーケンスを削除するにはDROP SEQUENCEを使います。

シーケンスは bigint 算術に基づいています。 そのため、8 バイト整数の範囲(-9223372036854775808 から 9223372036854775807まで)を越えることはできません。古めのプラットフォームでは、8バイト整数をサポートするコンパイラがないことがあります。 その場合、シーケンスは通常の integer 算術を使用します。 (その範囲は -2147483648 から +2147483647までです。)

cache が 1 以上の場合、それぞれのバックエンドは前もって割り当てられた番号を格納するために自身の独自のキャッシュを使います。キャッシュされていて現在のセッションでは使われていない番号は消えてしまうため、そのシーケンスには"穴"が空いてしまいます。

使用方法

101から始まるserialという名前の昇順シーケンスを作るには以下のようにします。

CREATE SEQUENCE serial START 101;
  

このシーケンスから次の番号を選択するには以下のようにします。

SELECT nextval('serial');
    
nextval
-------
    114
   

以下のようにして、このシーケンスを INSERT で使用します。

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
   

COPY FROM の後でシーケンス値を更新するには以下のようにします。

BEGIN;
    COPY distributors FROM 'input_file';
    SELECT setval('serial', max(id)) FROM distributors;
END;
   

互換性

SQL92

CREATE SEQUENCEPostgreSQL言語拡張です。SQL92には CREATE SEQUENCE文はありません。