CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ] [ OWNED BY { table.column | NONE } ]
CREATE SEQUENCEは、新しいシーケンス番号ジェネレータを作成します。 具体的には、新しくnameという名前を持つ、1行だけの特殊なテーブルの作成と初期化を行います。 シーケンスジェネレータは、このコマンドを実行したユーザによって所有されます。
スキーマ名が与えられている場合、そのシーケンスは指定されたスキーマで作成されます。 スキーマ名がなければ、シーケンスは現在のスキーマで作成されます。 また、一時シーケンスは特別なスキーマに存在するため、一時シーケンスの作成時にスキーマ名を与えることはできません。 シーケンス名は、同じスキーマ内の他のシーケンス、テーブル、インデックス、ビューとは異なる名前にする必要があります。
シーケンスを作成した後、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つだけなので、キャッシュがない状態になります)。これがデフォルトになっています。
CYCLEオプションを使用すると、シーケンスが限界値(昇順の場合はmaxvalue、降順の場合はminvalue)に達した時、そのシーケンスを周回させることができます。 限界値まで達した時、次に生成される番号は、昇順の場合はminvalue、降順の場合はmaxvalueになります。
NO CYCLEが指定された場合、シーケンスの限界値に達した後のnextval
呼び出しは全てエラーになります。
CYCLEもNO CYCLEも指定されていない場合は、NO CYCLEがデフォルトとなります。
OWNED BYオプションにより、シーケンスは指定されたテーブル列に関連付けされ、その列(やテーブル全体)が削除されると、自動的にシーケンスも同様に削除されるようになります。 指定するテーブルは、シーケンスと同一所有者でなければならず、また、同一のスキーマ内に存在しなければなりません。 デフォルトはOWNED BY NONEであり、こうした関連付けがないことを示します。
シーケンスを削除するにはDROP SEQUENCEを使用してください。
シーケンスはbigint演算に基づいています。 そのため、8バイト整数の範囲(-9223372036854775808から9223372036854775807まで)を越えることはできません。 比較的古いプラットフォームでは、8バイト整数をサポートするコンパイラがないことがあります。 その場合、シーケンスには通常のinteger演算が使用されます(この場合、範囲は-2147483648から+2147483647まで)。
シーケンスオブジェクトのcacheとして1より大きな値を設定した場合、そのシーケンスを複数のセッションで同時に使用すると、予想外の結果になる可能性があります。 各セッションは、シーケンスオブジェクトへの1回のアクセスの間に、連続するシーケンス値を取得し、キャッシュします。 そして、キャッシュした数に応じて、シーケンスオブジェクトのlast_valueを増加させます。 この場合、そのセッションは、その後のcache-1回に対しては、あらかじめ取得済みのシーケンス値を返し、シーケンスオブジェクトを変更しません。 セッションに割り当てられたが使用されなかったシーケンス番号は、セッションの終了時に全て失われるため、結果としてシーケンスに"穴"ができます。
さらに、複数のセッションには個別のシーケンス値が割り当てられることが保証されていますが、全てのセッションが尊重されると、シーケンス値が順番通りにならないことがあります。
例えば、cacheが10の場合を考えます。
セッションAでは1から10までを確保し、nextval
=1を返します。
セッションBでは、セッションAがnextval
=2を返す前に、11から20を確保し、nextval
=11を返します。
したがって、cacheを1に設定した場合はnextval
が連続した値であると考えても問題ありませんが、cacheを1より大きな値に設定した場合は、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;