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 clause で、シーケンスをどこからでも始めることが できます。 これを設定しない場合、シーケンス番号が始まる値は、 昇順の場合 minvalue の値 になり、降順の場合 maxvalue の値 になります。

cache

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

CYCLE

オプションの CYCLE キーワードは、昇順、あるいは降順の シーケンス番号が、それぞれ、 maxvalue あるいは minvalue の値に達した時に、そのシーケンス番号を継続することができる ようにするために使われます。 もしシーケンス番号の限界値 まで行った場合、次に生成される番号は minvalue あるいは maxvalue のどちらか適切な値になります。

出力

CREATE

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

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 という 名前を持った一列だけの新しいテーブルの作成と初期化を行います。 シーケンス番号生成機構は、CREATE SEQUENCE コマンドを実行したユーザによって "所有" されます。

シーケンスが作られた後、シーケンスから新しい値を取得する ために、 nextval(seqname) という関数を使うことができます。 currval('seqname') という関数は、現在の接続の中で指定のシーケンスが最後に nextval(seqname) が呼び出された時の返り値を知るために使われます。 setval('seqname', newvalue) という関数は、指定のシーケンスの現在値を設定し直すために 使います。 この関数で設定を行った後、次に nextval(seqname) が呼び出された場合、設定した値に増加量を加えた値を返します。

シーケンステーブルに対する問い合わせは、以下のようにします。

SELECT * FROM sequence_name;
   
上記コマンドで、シーケンスの全てのパラメータを得ることが できます。 パラメータの中からバックエンドに割り当て済みの値を取得 するには、以下のようにします。
SELECT last_value FROM sequence_name;
   
使うことができるパラメータは、 # このあと、原文が抜けているような...。

生成機構への多数の同時呼び出しを可能にするために Low-level locking (低レベルロック) が使われます。

Caution

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

注意

シーケンスを削除する方法は、 DROP SEQUENCE 文を参照してください。

各バックエンドは割り当てられた番号を保存するために自分用の キャッシュを使用します。キャッシュされただけで、現在の セッションで使われなかった(シーケンス)番号は失われ、 連続する番号の中に "抜け" ができます。

使用法

serial という名前で、開始番号が 101 の 昇順シーケンスを作るには、以下のようにします:

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;
   

互換性

CREATE SEQUENCE は、 Postgres の拡張言語です。

SQL92

SQL92CREATE SEQUENCE 文は有りません。