PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# 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 ]

## 説明

`CREATE SEQUENCE`は、新しいシーケンス番号生成機構を作成します。 これは、`name`という名前を持った一行だけの新しい特殊なテーブルの作成と初期化を行います。 シーケンス番号生成機構は、このコマンドを実行したユーザによって所有されます。

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

シーケンスを作成した後、`nextval`、`currval`、`setval`関数を使用してシーケンスを操作します。 この関数は項9.12で説明されています。

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

    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回につき1つの値だけを生成します。つまりキャッシュはありません）で、これがデフォルトにもなっています。

`CYCLE`
`NO CYCLE`

  `CYCLE`オプションによって、昇順、あるいは降順のシーケンス番号が、それぞれ`maxvalue`または`minvalue`の値に達した時に、シーケンスを元に戻すことができます。 もしシーケンス番号の限界値まで達した場合、次に生成される番号は`minvalue`または`maxvalue`のどちらかになります。

  `NO CYCLE`が指定された場合、制限に達した後の`nextval`呼び出しはエラーになります。 `CYCLE`も`NO CYCLE`も指定されない場合は、`NO CYCLE`がデフォルトです。

## 注釈

シーケンスを削除するには`DROP SEQUENCE`を使用してください。

シーケンスは`bigint`算術に基づいています。 そのため、8バイト整数の範囲(-9223372036854775808から9223372036854775807まで)を越えることはできません。 古めのプラットフォームでは、8バイト整数をサポートするコンパイラがないことがあります。 その場合、シーケンスは通常の`integer`算術を使用します。(その範囲は-2147483648から+2147483647までです。)

1より大きな値に設定された`cache`がシーケンスオブジェクトで使用された場合、そのシーケンスを複数のセッションで同時に使用した場合に予想外の結果になる場合があります。 各セッションは、セッションがシーケンスオブジェクトにアクセスすると、連続するシーケンス値を割り当てキャッシュします。 そして、それに伴い、シーケンスオブジェクトの`last_value`は増加します。 これにより、そのセッション内におけるその後の`cache`-1回の使用では、割り当て済みの値を単に返し、シーケンスオブジェクトは変更されません。 セッションにおいて割り当てられたが使用されなかった番号は、セッションの終了時に全て失われますので、結果としてシーケンスに"穴"ができます。

更に、複数のセッションには個別のシーケンス値が割り当てられることが保証されていますが、全てのセッションが尊重されると、シーケンスの値は順番通りにならないことがあります。 例えば、`cache`が10の場合を考えます。 セッションAでは1から10までを確保し、`nextval`=1を返します。 セッションBでは、セッションAが`nextval`=2を返す前に、11から20を確保し、`nextval`=11を返します。 従って、`cache`を1に設定した場合は`nextval`が連続した値を生成することを前提としても問題ありませんが、1より大きな値の`cache`が設定されると、`nextval`の値が本当に連続しているのではなく、全く異なる値となるということしか前提とすることができません。 また、`last_value`は、その値が`nextval`で返されたかどうかに関係なく、全てのセッションで確保された最後の値を反映します。

この他、そういったシーケンスに対して実行される`setval`は他のセッションでは、キャッシュした割り当て済の値を全て使い果たすまで、分からないということも考慮すべきです。

## 例

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;

## 互換性

`CREATE SEQUENCE`はSQL:2003で規定されています。 PostgreSQLは、以下の例外を除き、この標準に従います。

- 標準における`AS <data type>`式はサポートされていません。

- 次の値を取り出すには、標準の`NEXT VALUE FOR`式ではなく`nextval()`関数を使用します。

前のページ | ホーム | 次のページ
CREATE SCHEMA | 上に戻る | CREATE TABLE