CREATE SEQUENCE

Name

CREATE SEQUENCE  --  新しいシーケンス生成器を作成する。

Synopsis

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

入力

seqname

作成するシーケンス名。

increment

INCREMENT increment は省略可能です。 正の値は昇順のシーケンスを、負の値は降順のシーケンスを作成します。 デフォルト値は 1 です。

minvalue

MINVALUE minvalue は省略可能で、シーケンスが生成する番号の最小値を決定します。 デフォルト値はシーケンスが昇順の場合 1、降順の場合は -2147483647 です。

maxvalue

シーケンスが生成する最大値を決定するには、省略可能な MAXVALUE maxvalue 句を使用して下さい。 デフォルト値はシーケンスが昇順の場合 2147483647、 降順の場合は -1 です。

start

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

cache

CACHE cache オプションにより、あらかじめシーケンス番号を割り当て、メ モリ内に保存しておくことができます。 これによりより高速にアクセスすることができます。 最小値は 1 (一度に 1 つの値のみを生成します。つまり、キャッシュ を使用しません。) であり、この値がデフォルト値です。

CYCLE

省略可能な CYCLE キーワードを使用して、昇順のシーケンス の場合 maxvalue に、降順の場合 minvalue にそれぞれ達した時に、シーケンスを継続させることができ ます。 この制限値に達した時、その次に生成される番号は minvalue あるいは maxvalue のどちらか適切な値になります。

出力

CREATE

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

ERROR: Relation 'seqname' already exists

シーケンスが既に存在していた場合。

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

指定した最小値と最大値に矛盾があった場合。 (訳注: この出力メッセージは二重にあります。念のため訳を 下のものに合わせていますが、単なる COPY ミスなように見 えます。)

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

指定した開始番号が範囲外であった場合。

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

指定した最小値と最大値に矛盾があった場合。

説明

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

シーケンスを作成した後、 nextval(seqname) 関数を使用して、シーケンスから新しい番号を取り出すことができます。 currval('seqname') 関数を使用して、現セッションにおいて指定されたシーケンスから最新の nextval(seqname) 関数呼出によって返される値を求めることができます。 setval('seqname', newvalue) 関数を使用して、指定したシーケンスの現在値を設定することができます。 次回の nextval(seqname) の呼出は、ここで付与した値にシーケンスの増加量を足した値が返されます。

SELECT * FROM seqname;
   
という問い合わせを使用して、シーケンスのパラメータを取り 出すことができます。 上述の定義元からパラメータを取り出す別方法として、
SELECT last_value FROM seqname;
   
という問い合わせを使用して、全てのバックエンドによって割 り当てられた最新の値を入手できます。

生成器に対する複数同時呼出を可能にするために、低レベルなロック 機構が使用されています。

Caution

複数バックエンドによって同時に使用されるシーケンスオブジェクト に対して、1 以上のキャッシュの設定が使用されていた場合、予期し ない結果になる場合があります。 各バックエンドはシーケンスオブジェクトに一度アクセスする度に 連続したシーケンス番号を割り当て、キャッシュします。そして、そ れに従って、シーケンスオブジェクトの last_value を繰り上げます。 そして、その後のそのバックエンド内における、cache -1 回分の nextval の使用の際には、共有オブジェクトに影響を与えることなく、 単に事前に割り当て済みの値が返されます。 このため、現在のセッションで未使用の割り当て済みの番号は破棄さ れます。 更にいうと、複数バックエンドに独立したシーケンス番号が割り当て られることは保証されていますが、全てのバックエンドを考慮した場 合、値が順序通りにならない場合があります。(例えば、キャッ シュの設定が 10 の場合、バックエンド A が 1から 10 までを予約し、 nextval=1 を返したとすると、バックエンド B は 11 から 20 までを 予約し、バックエンド A が nextval=2 を生成するよりも前に nextval=11 を返すことになります。) 従って、nextval の値が順番に生成されることを前提とする場合、キャッ シュの設定を 1 にすることが安全です。 1 以上のキャッシュの設定する場合は、nextval の値は本当に順序通り に生成されるのではなく、すべて独立しているものであることだけを前 提としなければなりません。 また、last_value は、実際に nextval によって返されたかどうかに関 係なく、全てのバックエンドによって予約された最後の値を反映します。

注意

シーケンスを削除する場合は、DROP SEQUENCE を使用して下さい。

各バックエンドは割り当てられた番号を保管するために独自の キャッシュを使用します。 現在のセッションで未使用の割り当て済みの番号は破棄され、この 結果、シーケンスに "穴" が生じます。

使用法

101 から始まる、serial という昇順のシー ケンスを作成します。

CREATE SEQUENCE serial START 101;
  

上のシーケンスの次の番号を選択します。

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

INSERT 文にこのシーケンスを使用します。

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

COPY FROM の実行後、シーケンス番号を設定します。

CREATE FUNCTION distributors_id_max() RETURNS INT4
    AS 'SELECT max(id) FROM distributors' 
    LANGUAGE 'sql';
BEGIN;
    COPY distributors FROM 'input_file';
    SELECT setval('serial', distributors_id_max());
END;
   

互換性

SQL92

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