.\\" auto-generated by docbook2man-spec $Revision: 1.2 $
.TH "CREATE SEQUENCE" "" "2007-05-04" "SQL - 言語" "SQLコマンド"
.SH NAME
CREATE SEQUENCE \- 新しいシーケンスジェネレータを定義する

.SH SYNOPSIS
.sp
.nf
CREATE [ TEMPORARY | TEMP ] SEQUENCE \fIname\fR [ INCREMENT [ BY ] \fIincrement\fR ]
    [ MINVALUE \fIminvalue\fR | NO MINVALUE ] [ MAXVALUE \fImaxvalue\fR | NO MAXVALUE ]
    [ START [ WITH ] \fIstart\fR ] [ CACHE \fIcache\fR ] [ [ NO ] CYCLE ]
   [ OWNED BY { \fItable\fR.\fIcolumn\fR | NONE } ]
.sp
.fi
.SH "説明"
.PP
\fBCREATE SEQUENCE\fRは、新しいシーケンス番号ジェネレータを作成します。
具体的には、新しく\fIname\fRという名前を持つ、1行だけの特殊なテーブルの作成と初期化を行います。
シーケンスジェネレータは、このコマンドを実行したユーザによって所有されます。
.PP
スキーマ名が与えられている場合、そのシーケンスは指定されたスキーマで作成されます。
スキーマ名がなければ、シーケンスは現在のスキーマで作成されます。
また、一時シーケンスは特別なスキーマに存在するため、一時シーケンスの作成時にスキーマ名を与えることはできません。
シーケンス名は、同じスキーマ内の他のシーケンス、テーブル、インデックス、ビューとは異なる名前にする必要があります。
.PP
シーケンスを作成した後、\fBnextval\fR、\fBcurrval\fR、\fBsetval\fR関数を使用してシーケンスを操作します。
この関数についてはin the documentationを参照してください。
.PP
シーケンスを直接更新することはできませんが、以下のような問い合わせは可能です。
.sp
.nf
SELECT * FROM \fIname\fR;
.sp
.fi
これを使用すると、シーケンスのパラメータと現在の状態を確認することができます。
中でも、シーケンスのlast_valueフィールドは全てのセッションで割り当てられた最後の値を示します
（もちろんこの値は、他のセッションの\fBnextval\fRの実行により、表示された時点で既に最新ではない可能性があります）。
.SH "パラメータ"
.TP
\fBTEMPORARYもしくはTEMP\fR
このパラメータが指定された場合、作成するシーケンスオブジェクトがそのセッション専用となり、セッション終了時に自動的に削除されます。
一時シーケンスが存在する場合、同じ名前を持つ既存の永続シーケンスは、スキーマ修飾された名前で参照されない限り、（そのセッションでは）不可視です。
.TP
\fB\fIname\fB\fR
作成するシーケンスの名前です（スキーマ修飾名も可）。
.TP
\fB\fIincrement\fB\fR
INCREMENT BY \fIincrement\fR句は、現在のシーケンスの値から新しいシーケンス値を作成する際の値の増加量を設定します。この句は省略可能です。
正の値が指定された時は昇順のシーケンス、負の値が指定された時は降順のシーケンスを作成します。
指定がない場合のデフォルト値は1です。
.TP
\fB\fIminvalue\fB\fR
.TP
\fBNO MINVALUE\fR
MINVALUE \fIminvalue\fR句は、シーケンスとして作成する最小値を指定します。この句は省略可能です。
この句の指定されなかった場合、もしくは、\fBNO MINVALUE\fRが指定された場合、デフォルトが使用されます。
シーケンスのデフォルトの最小値は、昇順の時は1、降順の時は-(263-1)です。
.TP
\fB\fImaxvalue\fB\fR
.TP
\fBNO MAXVALUE\fR
MAXVALUE \fImaxvalue\fR句は、シーケンスの最大値を決定します。この句は省略可能です。
この句が指定されなかった場合、もしくは\fBNO MAXVALUE\fRが指定された場合、デフォルトが使用されます。
シーケンスのデフォルトの最小値は、昇順の時は263-1、降順の時は-1です。
.TP
\fB\fIstart\fB\fR
START WITH \fIstart\fR句を使用すると、任意の数からシーケンス番号を開始することができます。この句は省略可能です。
デフォルトでは、シーケンス番号が始まる値は、昇順の場合\fIminvalue\fR、降順の場合\fImaxvalue\fRになります。
.TP
\fB\fIcache\fB\fR
CACHE \fIcache\fRオプションは、あらかじめ番号を割り当て、メモリに格納しておくシーケンス番号の量を指定します。これによりアクセスを高速にすることができます。
最小値は1です（一度に生成する値が1つだけなので、キャッシュがない状態になります）。これがデフォルトになっています。
.TP
\fBCYCLE\fR
.TP
\fBNO CYCLE\fR
CYCLEオプションを使用すると、シーケンスが限界値（昇順の場合は\fImaxvalue\fR、降順の場合は\fIminvalue\fR）に達した時、そのシーケンスを周回させることができます。
限界値まで達した時、次に生成される番号は、昇順の場合は\fIminvalue\fR、降順の場合は\fImaxvalue\fRになります。

NO CYCLEが指定された場合、シーケンスの限界値に達した後の\fBnextval\fR呼び出しは全てエラーになります。
CYCLEもNO CYCLEも指定されていない場合は、NO CYCLEがデフォルトとなります。
.TP
\fBOWNED BY \fItable\fB.\fIcolumn\fB\fR
.TP
\fBOWNED BY NONE\fR
OWNED BYオプションにより、シーケンスは指定されたテーブル列に関連付けされ、その列（やテーブル全体）が削除されると、自動的にシーケンスも同様に削除されるようになります。
指定するテーブルは、シーケンスと同一所有者でなければならず、また、同一のスキーマ内に存在しなければなりません。
デフォルトはOWNED BY NONEであり、こうした関連付けがないことを示します。
.SH "注釈"
.PP
シーケンスを削除するには\fBDROP SEQUENCE\fRを使用してください。
.PP
シーケンスは\fBbigint\fR演算に基づいています。
そのため、8バイト整数の範囲（-9223372036854775808から9223372036854775807まで）を越えることはできません。
比較的古いプラットフォームでは、8バイト整数をサポートするコンパイラがないことがあります。
その場合、シーケンスには通常の\fBinteger\fR演算が使用されます（この場合、範囲は-2147483648から+2147483647まで）。
.PP
シーケンスオブジェクトの\fIcache\fRとして1より大きな値を設定した場合、そのシーケンスを複数のセッションで同時に使用すると、予想外の結果になる可能性があります。
各セッションは、シーケンスオブジェクトへの1回のアクセスの間に、連続するシーケンス値を取得し、キャッシュします。
そして、キャッシュした数に応じて、シーケンスオブジェクトのlast_valueを増加させます。
この場合、そのセッションは、その後の\fIcache\fR-1回に対しては、あらかじめ取得済みのシーケンス値を返し、シーケンスオブジェクトを変更しません。
セッションに割り当てられたが使用されなかったシーケンス番号は、セッションの終了時に全て失われるため、結果としてシーケンスに``穴''ができます。
.PP
さらに、複数のセッションには個別のシーケンス値が割り当てられることが保証されていますが、全てのセッションが尊重されると、シーケンス値が順番通りにならないことがあります。
例えば、\fIcache\fRが10の場合を考えます。
セッションAでは1から10までを確保し、\fBnextval\fR=1を返します。
セッションBでは、セッションAが\fBnextval\fR=2を返す前に、11から20を確保し、\fBnextval\fR=11を返します。
したがって、\fIcache\fRを1に設定した場合は\fBnextval\fRが連続した値であると考えても問題ありませんが、\fIcache\fRを1より大きな値に設定した場合は、\fBnextval\fRの値が全て異なることのみが保証され、連続した値であることは保証されません。
また、last_valueは、値が\fBnextval\fRによって返されたかどうかに関係なく、いずれかのセッションによって確保された最後の値となります。
.PP
この他、このようなシーケンスに対して\fBsetval\fRが実行されても、他のセッションは、それぞれがキャッシュした取得済みの値を全て使い果たすまで、それがわからないことも考慮すべき問題です。
.SH "例"
.PP
101から始まるserialという名前の昇順シーケンスを作成します。
.sp
.nf
CREATE SEQUENCE serial START 101;
.sp
.fi
.PP
このシーケンスから次の番号を選択します。
.sp
.nf
SELECT nextval('serial');
    
 nextval
---------
     114
.sp
.fi
.PP
このシーケンスを\fBINSERT\fRコマンドで使用します。
.sp
.nf
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
.sp
.fi
.PP
\fBCOPY FROM\fRの後でシーケンス値を更新します。
.sp
.nf
BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;
.sp
.fi
.SH "互換性"
.PP
以下の例外を除き、\fBCREATE SEQUENCE\fRは標準SQLに従います。
.TP 0.2i
\(bu
標準におけるAS <data type>式はサポートされていません。
.TP 0.2i
\(bu
次の値を取り出すには、標準の\fBNEXT VALUE FOR\fR式ではなく\fBnextval()\fR関数を使用します。
.TP 0.2i
\(bu
OWNED BY句はPostgreSQLの拡張です。
.PP
.SH "関連項目"
ALTER SEQUENCE [\fBalter_sequence\fR(l)], DROP SEQUENCE [\fBdrop_sequence\fR(l)]
