CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT increment ] [ MINVALUE minvalue ] [ MAXVALUE maxvalue ] [ START start ] [ CACHE cache ] [ CYCLE ]
指定された場合、このシーケンスオブジェクトはそのセッション用だけとして作成され、セッション終了時に自動的に削除されます。同じ名前の一時シーケンスが存在する場合、既存の永続シーケンスは(そのセッションでは)非可視です。
作成されるシーケンスの名前です。
省略可能な INCREMENT increment 句は、増加量を設定します。正の値は昇順のシーケンス番号、負の値は降順のシーケンス番号を作成します。設定しない場合のデフォルト値は 1 です
省略可能な MINVALUE minvalue 句は、シーケンス番号として作成できる最小の値を決定します。昇順と降順のシーケンスのデフォルト値は、それぞれ 1 と -2^63-1 です。
省略可能な MAXVALUE maxvalue 句は、シーケンス番号の最大値を決定します。昇順と降順のそれぞれのシーケンス番号の最大値のデフォルトは、2^63-1と-1です。
省略可能な START start 句によって、シーケンスをどこからでも始めることができます。デフォルトでは、シーケンス番号が始まる値は、昇順の場合 minvalue に、降順の場合 maxvalueになります。
CACHE cache オプションによって、あらかじめシーケンス番号を割り当て、それをメモリに格納しておくことでアクセスを高速にすることができます。最小値は1(これは1回につき1つの値だけを生成します。つまりキャッシュはありません)で、これがデフォルトにもなっています。
オプションのCYCLEキーワードは、昇順、あるいは降順のシーケンス番号が、それぞれ maxvalueまたは minvalueの値に達したときに、シーケンスを元に戻すことを可能にするために使えます。もしシーケンス番号の限界値まで達した場合、次に生成される番号はminvalue または maxvalue のどちらかになります。CYCLE の指定がない場合、制限に達した後の nextval 呼び出しはエラーになります。
コマンドに成功した場合に返されるメッセージです。
指定したシーケンスがすでに存在している場合のメッセージです。
範囲外の初期値が設定された場合です(最大値以上の値が設定されました)。
範囲外の初期値が設定されました(最小値より小さい値が設定されました)。
最小値、最大値の設定が矛盾しています(最小値が、最大値より大きい値に設定されました)。
CREATE SEQUENCEは、新しいシーケンス番号生成機構を現在のデータベースの中に登録します。これは、seqname という名前を持った一行だけの新しいテーブルの作成と初期化を行います。シーケンス番号生成機構は、このコマンドを実行したユーザによって所有されます。
シーケンスを作成した後、 nextval、 currval、 setval 関数を使用してシーケンスを操作します。この関数は ユーザガイド で説明されています。
シーケンスを直接更新することはできませんが、
SELECT * FROM seqname;
という問い合わせを使用して、シーケンスのパラメータと現在の状態を確認することができます。特に、シーケンスの last_value フィールドは全てのバックエンドプロセスで割り当てられた最後の値を示します。(もちろん、この値は表示された時点で、他のプロセスの nextval の実行により古くなっている場合もあります。)
Caution |
もし、複数のバックエンドによって同時に使用される可能性のあるシーケンスオブジェクトに対し、cache 設定が1よりも大きい場合、予想外の結果となることがあります。それぞれのバックエンドはシーケンスオブジェクトにアクセスするたびに連続したシーケンスの値を割り当て、キャッシュし、それに応じてシーケンスオブジェクトの last_value を増やします。次に、そのバックエンドにおける、引き続く cache - 1 回の nextval の使用は共有オブジェクトに触ることなく、事前に割り当てられた値を返します。したがって、割り当てられても、指定されたセッションで使われなかった(シーケンス)番号は破棄されます。さらに、複数のバックエンドは重複しないシーケンス番号が割り当てられることを保証されていますが、その値はすべてのバックエンドを対象にした場合、順列に付いているかは定かでありません(たとえば、 cache 設定が10となっていて、バックエンドAが1...10までの値を予約し、nextval=1を返すとした場合、バックエンドB が11...20の値を予約してバックエンドAがnextval=2を生成する前にnextval=11を返すことがあります)。従って、cache設定が 1 の場合、nextval の値は連続的に生成されると想定することは安全ですが、cache 設定が 1 より大きいときは、nextval の値はすべて重複しない値になりますが、それらは純粋に連続的に生成されるというわけではありません。同様に、last_value は、nextval によってどんな値が返されるかということにかかわらず、バックエンドによって一番最近に予約された値を反映しています。もう1つ考慮するべき点は、そのようなシーケンスで実行された setval はキャッシュしている前もって割り当てられた値を使い切るまで他のバックエンドには認識されないということです。 |
シーケンスを削除するにはDROP SEQUENCEを使います。
シーケンスは bigint 算術に基づいています。そのため、8 バイト整数の範囲(-9223372036854775808 から 9223372036854775807まで)を越えることはできません。古めのプラットフォームでは、8バイト整数をサポートするコンパイラがないことがあります。その場合、シーケンスは通常の integer 算術を使用します。(その範囲は -2147483648 から +2147483647までです。)
cache が 1 以上の場合、それぞれのバックエンドは前もって割り当てられた番号を格納するために自身の独自のキャッシュを使います。キャッシュされていて現在のセッションでは使われていない番号は消えてしまうため、そのシーケンスには"穴"が空いてしまいます。
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;