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 seqname;
   
上記コマンドで、シーケンスのパラメータを検査することができます。 上記のようにもとの定義からパラメータを取りだす代替案として、 バックエンドから割り当てられた最後の値を得るために 下記を使うことができます。
SELECT last_value FROM seqname;
   

同じシーケンスからの数を含む並行トランザクションのブロックを 避けるために、nextval 演算がロールバックされることがありません。 つまり一度値が取りだされると、もしその nextval を行なったトランザクション が後でアボートしても、その値は使用済であると仮定されます。これは アボートされたトランザクションは未使用の"穴"を割り振られた値のシーケンス に残す可能性があります。setval 演算もロールバックされることはありません。

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 が順序だって生成されることが重要です。 もう一つ考慮するべき点は、そのようなシーケンスで実行された setval は キャッシュしている前もって割り振られた値を使い切るまで他のバックエンド には認識されないということです。

注釈

シーケンスを削除するには 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;
   

互換性

SQL92

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