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.12で説明されています。
シーケンスを直接更新することはできませんが、以下のような問い合わせを使用できます。
SELECT * FROM name;
これを使用すると、シーケンスのパラメータと現在の状態を確認することができます。 特に、シーケンスのlast_valueフィールドは全てのセッションで割り当てられた最後の値を示します。 (もちろん、この値は表示された時点で、他のセッションのnextvalの実行により古くなっている場合もあります。)
指定された場合、このシーケンスオブジェクトはそのセッション用だけとして作成され、セッション終了時に自動的に削除されます。 一時シーケンスが存在する場合、同じ名前を持つ既存の永続シーケンスはスキーマ修飾された名前で参照されていなければ、(そのセッションでは)非可視です。
作成するシーケンスの名前です (スキーマ修飾名でも可)。
省略可能なINCREMENT BY increment句は、現在のシーケンスの値から新しい値を作成する時に足し込まれる増加量を設定します。 正の値は昇順のシーケンス、負の値は降順のシーケンスを作成します。 設定しない場合のデフォルト値は1です。
省略可能なMINVALUE minvalue句は、シーケンスとして作成できる最小の値を決定します。 この句の指定がない、もしくは、NO MINVALUEが指定された場合、デフォルトが使用されます。 昇順と降順のシーケンスのデフォルト値は、それぞれ1と-(263-1)です。
省略可能なMAXVALUE maxvalue句は、シーケンスの最大値を決定します。 この句の指定がない、もしくは、NO MAXVALUEが指定された場合、デフォルトが使用されます。 昇順と降順のそれぞれのシーケンス番号の最大値のデフォルトは、263-1と-1です。
省略可能なSTART WITH 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;