CREATE SEQUENCE

名前

CREATE SEQUENCE -- 新しいシーケンスジェネレータを定義する

概要

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行だけの特殊なテーブルの作成と初期化を行います。 シーケンスジェネレータは、このコマンドを実行したユーザによって所有されます。

スキーマ名が与えられている場合、そのシーケンスは指定されたスキーマで作成されます。 スキーマ名がなければ、シーケンスは現在のスキーマで作成されます。 また、一時シーケンスは特別なスキーマに存在するため、一時シーケンスの作成時にスキーマ名を与えることはできません。 シーケンス名は、同じスキーマ内の他のシーケンス、テーブル、インデックス、ビューとは異なる名前にする必要があります。

シーケンスを作成した後、nextvalcurrvalsetval関数を使用してシーケンスを操作します。 この関数については項9.15を参照してください。

シーケンスを直接更新することはできませんが、以下のような問い合わせは可能です。

SELECT * FROM name;

これを使用すると、シーケンスのパラメータと現在の状態を確認することができます。 中でも、シーケンスのlast_valueフィールドは全てのセッションで割り当てられた最後の値を示します (もちろんこの値は、他のセッションのnextvalの実行により、表示された時点で既に最新ではない可能性があります)。

パラメータ

TEMPORARYもしくはTEMP

このパラメータが指定された場合、作成するシーケンスオブジェクトがそのセッション専用となり、セッション終了時に自動的に削除されます。 一時シーケンスが存在する場合、同じ名前を持つ既存の永続シーケンスは、スキーマ修飾された名前で参照されない限り、(そのセッションでは)不可視です。

name

作成するシーケンスの名前です(スキーマ修飾名も可)。

increment

INCREMENT BY increment句は、現在のシーケンスの値から新しいシーケンス値を作成する際の値の増加量を設定します。この句は省略可能です。 正の値が指定された時は昇順のシーケンス、負の値が指定された時は降順のシーケンスを作成します。 指定がない場合のデフォルト値は1です。

minvalue
NO MINVALUE

MINVALUE minvalue句は、シーケンスとして作成する最小値を指定します。この句は省略可能です。 この句の指定されなかった場合、もしくは、NO MINVALUEが指定された場合、デフォルトが使用されます。 シーケンスのデフォルトの最小値は、昇順の時は1、降順の時は-(263-1)です。

maxvalue
NO MAXVALUE

MAXVALUE maxvalue句は、シーケンスの最大値を決定します。この句は省略可能です。 この句が指定されなかった場合、もしくはNO MAXVALUEが指定された場合、デフォルトが使用されます。 シーケンスのデフォルトの最小値は、昇順の時は263-1、降順の時は-1です。

start

START WITH start句を使用すると、任意の数からシーケンス番号を開始することができます。この句は省略可能です。 デフォルトでは、シーケンス番号が始まる値は、昇順の場合minvalue、降順の場合maxvalueになります。

cache

CACHE cacheオプションは、あらかじめ番号を割り当て、メモリに格納しておくシーケンス番号の量を指定します。これによりアクセスを高速にすることができます。 最小値は1です(一度に生成する値が1つだけなので、キャッシュがない状態になります)。これがデフォルトになっています。

CYCLE
NO CYCLE

CYCLEオプションを使用すると、シーケンスが限界値(昇順の場合はmaxvalue、降順の場合はminvalue)に達した時、そのシーケンスを周回させることができます。 限界値まで達した時、次に生成される番号は、昇順の場合はminvalue、降順の場合はmaxvalueになります。

NO CYCLEが指定された場合、シーケンスの限界値に達した後のnextval呼び出しは全てエラーになります。 CYCLENO CYCLEも指定されていない場合は、NO CYCLEがデフォルトとなります。

OWNED BY table.column
OWNED BY NONE

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
---------
     101

このシーケンスから次の番号を選択します。

SELECT nextval('serial');

 nextval
---------
     102

このシーケンスをINSERTコマンドで使用します。

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

COPY FROMの後でシーケンス値を更新します。

BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;

互換性

以下の例外を除き、CREATE SEQUENCEは標準SQLに従います。

関連項目

ALTER SEQUENCE, DROP SEQUENCE