CREATE SEQUENCEは、新しいシーケンス番号ジェネレータを作成します。
説明
CREATE SEQUENCEは、新しいシーケンス番号ジェネレータを作成します。 これには、名前nameを持つ新しい特別な単一行テーブルの作成と初期化が含まれます。 ジェネレータは、コマンドを発行するユーザによって所有される。
スキーマ名が指定されている場合、シーケンスは指定されたスキーマに作成されます。 指定されない場合は、現在のスキーマに作成されます。 一時シーケンスは特別なスキーマに存在するため、一時シーケンスを作成するときにスキーマ名を指定することはできません。 シーケンス名は、同じスキーマ内の他のシーケンス、テーブル、インデックス、ビュー、または外部テーブルの名前とは異なる必要があります。
シーケンスの作成後、nextval、currval、およびsetval関数を使用してシーケンスを操作します。
シーケンスを直接更新することはできませんが、次のようなクエリを使用できます。
SELECT * FROM名;シーケンスのパラメータと現在の状態を調べます。 特に、シーケンスのlast_valueフィールドは、任意のセッションによって割り当てられた最後の値を示す。 (もちろん、他のセッションがnextval呼び出しをアクティブに実行している場合、この値は印刷されるまでに廃止される可能性があります。)
概要
CREATE [ TEMPORARY | TEMP] シーケンス [存在しない場合] name [ INCREMENT [ BY ] increment]
[MINVALUE minvalue | NOMINVALUE] [ MAXVALUE maxvalue | NOMAXVALUE]
[START [ WITH ] start ] [ CACHEキャッシュ] [ [ NO ] CYCLE]
[{table_name.column_name | NONE} によって所有される] パラメーター
TEMPORARYまたはTEMP: 指定した場合、シーケンスオブジェクトはこのセッションに対してのみ作成され、セッション終了時に自動的にドロップされます。 同じ名前の既存の永続的なシーケンスは、スキーマ修飾名で参照されない限り、一時的なシーケンスが存在する間は (このセッションでは) 表示されません。
IF NOT EXISTS: 同じ名前のリレーションがすでに存在する場合は、エラーをスローしないでください。 この場合、通知が発行されます。 既存の関係が作成されたシーケンスのようなものであるという保証はないことに注意してください。シーケンスではない場合もあります。
name: 作成するシーケンスの名前 (スキーマ修飾) 。
data_type: オプションのAS data_type句は、シーケンスのデータ型を指定します。 有効な型は、smallint、integer、bigintです。 bigintがデフォルトです。 データ型は、シーケンスのデフォルトの最小値と最大値を決定します。
increment: オプションのINCREMENT BY increment句は、新しい値を作成するために現在のシーケンス値に追加される値を指定します。 正の値は昇順のシーケンスになり、負の値は降順のシーケンスになります。 デフォルト値は 1 です。
minvalue NO MINVALUE: オプションの句MINVALUE minvalueは、シーケンスが生成できる最小値を決定します。 この句が指定されていない場合、またはNO MINVALUEが指定されている場合は、デフォルトが使用されます。 昇順シーケンスのデフォルトは1です。 降順の既定値は、データ型の最小値です。
maxvalue NO_MAXVALUE: オプションの句MAXVALUE MAXVALUEは、シーケンスの最大値を決定します。 この句が指定されていない場合、またはNO MAXVALUEが指定されている場合は、デフォルト値が使用されます。 昇順シーケンスのデフォルトは、データ型の最大値です。 降順のデフォルトは-1です。
start: オプションのSTART WITH start句を使用すると、シーケンスをどこからでも開始できます。 デフォルトの開始値は、昇順の場合はminvalue、降順の場合はmaxvalueです。
cache: オプションの句CACHE cacheは、アクセスを高速化するために、事前に割り当てられメモリに格納されるシーケンス番号の数を指定します。 最小値は1であり (一度に1つの値しか生成できない、すなわち、キャッシュなし) 、これもデフォルトである。
CYCLE NO CYCLE: CYCLEオプションでは、maxvalueまたはminvalueにそれぞれ昇順または降順で到達したときに、シーケンスをラップアラウンドできます。 制限に達すると、次に生成される数は、それぞれminvalueまたはmaxvalueになります。
NO CYCLEが指定されている場合、シーケンスが最大値に達した後にnextvalを呼び出すとエラーが返されます。 CYCLEもNO CYCLEも指定されていない場合、NO CYCLEがデフォルトです。
[所有] table_name。 colume_name OWNED BY NONE: OWNED BYオプションを使用すると、シーケンスが特定のテーブル列に関連付けられ、その列 (またはそのテーブル全体) が削除されると、シーケンスも自動的に削除されます。 指定されたテーブルは、同じ所有者を持ち、シーケンスと同じスキーマにある必要があります。 デフォルトのOWNED BY NONEは、そのような関連付けがないことを指定します。
注
DROP SEQUENCEを使用してシーケンスを削除します。
シーケンスはbigint演算に基づいているため、範囲は8バイトの整数 (-9223372036854775808〜9223372036854775807) の範囲を超えることはできません。
nextvalおよびsetval呼び出しはロールバックされないため、シーケンス番号の「ギャップレス」割り当てが必要な場合、シーケンスオブジェクトを使用できません。 カウンタを含むテーブルの排他的ロックを使用してギャップレス割り当てを構築することは可能ですが、このソリューションは、特に多くのトランザクションが同時にシーケンス番号を必要とする場合、シーケンスオブジェクトよりもはるかに高価です。
複数のセッションで同時に使用されるシーケンスオブジェクトに対して1を超えるキャッシュ設定を使用すると、予期しない結果が得られることがあります。 各セッションは、シーケンスオブジェクトへの1回のアクセス中に連続するシーケンス値を割り当ててキャッシュし、それに応じてシーケンスオブジェクトのlast_valueを増加させる。 次に、そのセッション内のnextvalの次のcache -1使用は、シーケンスオブジェクトに触れることなく、事前に割り当てられた値を返すだけです。 したがって、セッション内で割り当てられているが使用されていない番号は、そのセッションが終了すると失われ、シーケンスに「穴」が生じます。
さらに、複数のセッションが別個のシーケンス値を割り当てることが保証されるが、すべてのセッションが考慮されるときに、値がシーケンス外で生成され得る。 たとえば、キャッシュ設定が10の場合、セッションaは値1〜10を予約してnextval =1を返し、セッションBは値11〜20を予約してnextval =11を返してから、セッションAはnextval =2を生成します。 したがって、cache設定が1の場合、nextval値が順次生成されると仮定するのが安全です。cache設定が1より大きい場合は、nextval値がすべて異なると仮定してください。 また、last_valueは、nextvalによってまだ返されていないかどうかにかかわらず、任意のセッションによって予約された最新の値を反映します。
別の考慮すべき点は、そのようなシーケンス上で実行されるセット値は、キャッシュされた事前に割り当てられた値を使い果たすまで、他のセッションによって気付かれないことである。
例
101から始まるserialという昇順シーケンスを作成します。
CREATE SEQUENCEシリアルSTART 101;このシーケンスから次の番号を選択します。
SELECT nextval('serial');
nextval
---------
101 このシーケンスから次の番号を選択します。
SELECT nextval('serial');
nextval
---------
102 INSERTコマンドで次のシーケンスを使用します。
INSERT INTOディストリビューターVALUES (nextval('serial') 、'nothing ');COPY FROMの後のシーケンス値を更新します。
BEGIN;
「input_file」からのCOPYディストリビューター;
販売代理店からのSELECT setval('serial' 、max(id));
エンド;