.\\" auto-generated by docbook2man-spec $Revision: 1.2 $
.TH "CREATE SEQUENCE" "" "2003-08-02" "SQL - 言語" "SQL コマンド"
.SH NAME
CREATE SEQUENCE \- 新しいシーケンス生成器の定義
.SH SYNOPSIS
.sp
.nf
CREATE [ TEMPORARY | TEMP ] SEQUENCE \fIseqname\fR [ INCREMENT \fIincrement\fR ]
    [ MINVALUE \fIminvalue\fR ] [ MAXVALUE \fImaxvalue\fR ]
    [ START \fIstart\fR ] [ CACHE \fIcache\fR ] [ CYCLE ]
  
.sp
.fi
.SS "入力"
.PP
.TP
\fBTEMPORARY or TEMP\fR
指定された場合、このシーケンスオブジェクトはそのセッション用だけとして作成され、セッション終了時に自動的に削除されます。 一時シーケンスが存在する場合、同じ名前を持つ既存の永続シーケンスはスキーマ修飾された名前で参照されていなければ、(そのセッションでは) 非可視です。
.TP
\fB\fIseqname\fB\fR
作成するシーケンスの名前です (スキーマ修飾名でも可)。
.TP
\fB\fIincrement\fB\fR
省略可能な \fBINCREMENT \fIincrement\fB\fR 句は、増加量を設定します。正の値は昇順のシーケンス番号、負の値は降順のシーケンス番号を作成します。設定しない場合のデフォルト値は 1 です
.TP
\fB\fIminvalue\fB\fR
省略可能な \fBMINVALUE \fIminvalue\fB\fR 句は、シーケンス番号として作成できる最小の値を決定します。昇順と降順のシーケンスのデフォルト値は、それぞれ 1 と -2^63-1 です。
.TP
\fB\fImaxvalue\fB\fR
省略可能な \fBMAXVALUE \fImaxvalue\fB\fR 句は、シーケンス番号の最大値を決定します。昇順と降順のそれぞれのシーケンス番号の最大値のデフォルトは、2^63-1と-1です。
.TP
\fB\fIstart\fB\fR
省略可能な \fBSTART \fIstart\fB\fR 句によって、シーケンスをどこからでも始めることができます。デフォルトでは、シーケンス番号が始まる値は、昇順の場合 \fIminvalue\fR に、降順の場合 \fImaxvalue\fRになります。
.TP
\fB\fIcache\fB\fR
\fBCACHE \fIcache\fB\fR オプションによって、あらかじめシーケンス番号を割り当て、それをメモリに格納しておくことでアクセスを高速にすることができます。最小値は1（これは1回につき1つの値だけを生成します。つまりキャッシュはありません）で、これがデフォルトにもなっています。
.TP
\fBCYCLE\fR
オプションのCYCLEキーワードは、昇順、あるいは降順のシーケンス番号が、それぞれ\fImaxvalue\fRまたは\fIminvalue\fRの値に達したときに、シーケンスを元に戻すことを可能にするために使えます。もしシーケンス番号の限界値まで達した場合、次に生成される番号は\fIminvalue\fR または \fImaxvalue\fRのどちらかになります。CYCLE の指定がない場合、制限に達した後の \fBnextval\fR 呼び出しはエラーになります。
.PP
.SS "出力"
.PP
.TP
\fBCREATE SEQUENCE\fR
コマンドに成功した場合に返されるメッセージです。
.TP
\fBERROR: Relation '\fIseqname\fB' already exists\fR
指定したシーケンスがすでに存在している場合のメッセージです。
.TP
\fBERROR: DefineSequence:MINVALUE (\fIstart\fB) can't be >= MAXVALUE (\fImax\fB)\fR
範囲外の初期値が設定されました（最大値以上の値が設定されました）。
.TP
\fBERROR: DefineSequence:START value (\fIstart\fB) can't be < MINVALUE (\fImin\fB)\fR
範囲外の初期値が設定されました（最小値より小さい値が設定されました）。
.TP
\fBERROR: DefineSequence:MINVALUE (\fImin\fB) can't be >= MAXVALUE (\fImax\fB)\fR
最小値、最大値の設定が矛盾しています（最小値が、最大値より大きい値に設定されました）。
.PP
.SH "説明"
.PP
\fBCREATE SEQUENCE\fRは、新しいシーケンス番号生成機構を現在のデータベースの中に登録します。これは、\fIseqname\fR という名前を持った一行だけの新しいテーブルの作成と初期化を行います。シーケンス番号生成機構は、このコマンドを実行したユーザによって所有されます。
.PP
スキーマ名が与えられている場合、そのシーケンスは指定されたスキーマで作成されます。 スキーマ名がなければ、シーケンスは現在のスキーマ (検索パスの前にあるスキーマ。CURRENT_SCHEMA() 参照) で作成されます。 また、TEMP シーケンスは特別なスキーマに存在するため、TEMP シーケンスの作成時にスキーマ名を与えられない場合もあります。 シーケンス名は、同じスキーマ内の他のシーケンス、テーブル、インデックス、もしくはビューとは異なる名前にする必要があります。
.PP
シーケンスを作成した後、\fBnextval\fR、\fBcurrval\fR、\fBsetval\fR 関数を使用してシーケンスを操作します。この関数は \fIユーザガイド\fR で説明されています。
.PP
シーケンスを直接更新することはできませんが、以下のような問い合わせを使用できます。
.sp
.nf
SELECT * FROM \fIseqname\fR;
   
.sp
.fi
これを使用すると、シーケンスのパラメータと現在の状態を確認することができます。特に、シーケンスの last_value フィールドは全てのバックエンドプロセスで割り当てられた最後の値を示します。(もちろん、この値は表示された時点で、他のプロセスの \fBnextval\fR の実行により古くなっている場合もあります。)
.sp
.RS
.B "Caution:"
もし、複数のバックエンドによって同時に使用される可能性のあるシーケンスオブジェクトに対し、\fIcache\fR 設定が1よりも大きい場合、予想外の結果となることがあります。それぞれのバックエンドはシーケンスオブジェクトにアクセスするたびに連続したシーケンスの値を割り当て、キャッシュし、それに応じてシーケンスオブジェクトの last_value を増やします。次に、そのバックエンドにおける、引き続く \fIcache\fR - 1 回の \fBnextval\fR の使用は共有オブジェクトに触ることなく、事前に割り当てられた値を返します。したがって、割り当てられても、指定されたセッションで使われなかった（シーケンス）番号は破棄されます。 さらに、複数のバックエンドは重複しないシーケンス値が割り当てられることを保証されていますが、その値はすべてのバックエンドを対象にした場合、順列に付いているかは定かでありません。 （たとえば、\fIcache\fR 設定が 10 となっていて、バックエンド A が 1...10 までの値を予約し、\fBnextval\fR=1 を返すとした場合、バックエンド B が 11...20 の値を予約して、バックエンド A が nextval=2 を生成する前に \fBnextval\fR=11 を返すことがあります。）従って、\fIcache\fR設定が 1 の場合、\fBnextval\fR の値は連続的に生成されると想定することは安全ですが、\fIcache\fR 設定が 1 より大きいときは、\fBnextval\fR の値はすべて重複しない値になりますが、それらは純粋に連続的に生成されるというわけではありません。同様に、last_value は、\fBnextval\fR によってどんな値が返されるかということにかかわらず、バックエンドによって一番最近に予約された値を反映しています。もう1つ考慮するべき点は、そのようなシーケンスで実行された \fBsetval\fR はキャッシュしている前もって割り当てられた値を使い切るまで他のバックエンドには認識されないということです。
.RE
.sp
.SS "注釈"
.PP
シーケンスを削除するには\fBDROP SEQUENCE\fRを使います。
.PP
シーケンスは \fBbigint\fR 算術に基づいています。 そのため、8 バイト整数の範囲(-9223372036854775808 から 9223372036854775807まで)を越えることはできません。古めのプラットフォームでは、8バイト整数をサポートするコンパイラがないことがあります。 その場合、シーケンスは通常の \fBinteger\fR 算術を使用します。 (その範囲は -2147483648 から +2147483647までです。)
.PP
\fIcache\fR が 1 以上の場合、それぞれのバックエンドは前もって割り当てられた番号を格納するために自身の独自のキャッシュを使います。キャッシュされていて現在のセッションでは使われていない番号は消えてしまうため、そのシーケンスには``穴''が空いてしまいます。
.SH "使用方法"
.PP
101から始まるserialという名前の昇順シーケンスを作るには以下のようにします。
.sp
.nf
CREATE SEQUENCE serial START 101;
  
.sp
.fi
.PP
このシーケンスから次の番号を選択するには以下のようにします。
.sp
.nf
SELECT nextval('serial');
    
nextval
-------
    114
   
.sp
.fi
.PP
以下のようにして、このシーケンスを INSERT で使用します。
.sp
.nf
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
   
.sp
.fi
.PP
COPY FROM の後でシーケンス値を更新するには以下のようにします。
.sp
.nf
BEGIN;
    COPY distributors FROM 'input_file';
    SELECT setval('serial', max(id)) FROM distributors;
END;
   
.sp
.fi
.SH "互換性"
.SS "SQL92"
.PP
\fBCREATE SEQUENCE\fRは PostgreSQL言語拡張です。SQL92には \fBCREATE SEQUENCE\fR文はありません。
