CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
CREATE SEQUENCEは、新しいシーケンス番号生成機構を作成します。 これは、name という名前を持った一行だけの新しい特殊なテーブルの作成と初期化を行います。 シーケンス番号生成機構は、このコマンドを実行したユーザによって所有されます。
スキーマ名が与えられている場合、そのシーケンスは指定されたスキーマで作成されます。 スキーマ名がなければ、シーケンスは現在のスキーマで作成されます。 また、一時シーケンスは特別なスキーマに存在するため、一時シーケンスの作成時にスキーマ名を与えることはできません。 シーケンス名は、同じスキーマ内の他のシーケンス、テーブル、インデックス、もしくはビューとは異なる名前にする必要があります。
シーケンスを作成した後、nextval、currval、setval 関数を使用してシーケンスを操作します。 この関数は 項9.11 で説明されています。
シーケンスを直接更新することはできませんが、以下のような問い合わせを使用できます。
SELECT * FROM name;
これを使用すると、シーケンスのパラメータと現在の状態を確認することができます。 特に、シーケンスの last_value フィールドは全てのセッションで割り当てられた最後の値を示します。 (もちろん、この値は表示された時点で、他のプロセスの nextval の実行により古くなっている場合もあります。)
指定された場合、このシーケンスオブジェクトはそのセッション用だけとして作成され、セッション終了時に自動的に削除されます。 一時シーケンスが存在する場合、同じ名前を持つ既存の永続シーケンスはスキーマ修飾された名前で参照されていなければ、(そのセッションでは) 非可視です。
作成するシーケンスの名前です (スキーマ修飾名でも可)。
省略可能な INCREMENT increment 句は、現在のシーケンスの値から新しい値を作成する時に足し込まれる増加量を設定します。 正の値は昇順のシーケンス、負の値は降順のシーケンスを作成します。 設定しない場合のデフォルト値は 1 です
省略可能な MINVALUE minvalue 句は、シーケンスとして作成できる最小の値を決定します。 この句の指定がない、もしくは、NO MINVALUE が指定された場合、デフォルトが使用されます。 昇順と降順のシーケンスのデフォルト値は、それぞれ 1 と -(263-1) です。
省略可能な MAXVALUE maxvalue 句は、シーケンスの最大値を決定します。 この句の指定がない、もしくは、NO MAXVALUE が指定された場合、デフォルトが使用されます。 昇順と降順のそれぞれのシーケンス番号の最大値のデフォルトは、263-1と-1です。
省略可能な START start 句によって、シーケンスをどこからでも始めることができます。 デフォルトでは、シーケンス番号が始まる値は、昇順の場合 minvalue に、降順の場合 maxvalueになります。
CACHE cache オプションは、どのくらいの数のシーケンス番号をあらかじめ番号を割り当て、メモリに格納するかを指定します。これによりアクセスを高速にすることができます。 最小値は1(これは1回につき1つの値だけを生成します。つまりキャッシュはありません)で、これがデフォルトにもなっています。
CYCLEオプションによって、昇順、あるいは降順のシーケンス番号が、それぞれmaxvalueまたはminvalueの値に達した時に、シーケンスを元に戻すことができます。 もしシーケンス番号の限界値まで達した場合、次に生成される番号はminvalue または maxvalueのどちらかになります。
NO CYCLEが指定された場合、制限に達した後の nextval 呼び出しはエラーになります。 CYCLE もNO CYCLE も指定されない場合は、NO CYCLE がデフォルトです。
シーケンスを削除するにはDROP SEQUENCEを使います。
シーケンスは bigint 算術に基づいています。 そのため、8 バイト整数の範囲(-9223372036854775808 から 9223372036854775807まで)を越えることはできません。 古めのプラットフォームでは、8バイト整数をサポートするコンパイラがないことがあります。 その場合、シーケンスは通常の integer 算術を使用します。 (その範囲は -2147483648 から +2147483647までです。)
1より大きな値に設定された cache がシーケンスオブジェクトで使用された場合、そのシーケンスを複数のセッションで同時に使用した場合に予想外の結果になる場合があります。 各セッションは、セッションがシーケンスオブジェクトにアクセスすると、連続するシーケンス値を割り当てキャッシュします。そして、それに伴い、シーケンスオブジェクトのlast_value は増加します。 これにより、そのセッション内におけるその後のcache-1回の使用では、割り当て済みの値を単に返し、シーケンスオブジェクトは変更されません。 セッションにおいて割り当てられたが使用されなかった番号は、セッションの終了時に全て失われますので、結果としてシーケンスに"穴"ができます。
更に、複数のセッションには個別のシーケンス値が割り当てられることが保証されていますが、全てのセッションが尊重されると、シーケンスの範囲外の値が生成されることがあります。 例えば、cache が10の場合を考えます。 セッションAでは 1から10までを確保し、nextval=1を返します。 セッションBでは、セッションAがnextval=2を返す前に、11から20を確保し、nextval=11 を返します。 したがって、cache を1に設定することで、nextval が連続した値を生成することを前提としても問題ありませんが、1より大きな値のcacheが設定されると、nextval の値が本当に連続しているのではなく、全て異なるということしか前提とすることができません。 また、last_value は、その値がnextval で返されたかどうかに関係なく、任意のセッションで確保された最後の値を反映します。
この他、そういったシーケンスに対して実行されるsetval は他のセッションでは、キャッシュした割り当て済の値を全て使い果たすまで、分からないということも考慮すべきです。
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;