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

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

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

シーケンスを作成した後、`nextval`、`currval`、`setval`関数を使用してシーケンスを操作します。 この関数については項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`呼び出しは全てエラーになります。 `CYCLE`も`NO 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に従います。

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

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

- `OWNED BY`句はPostgreSQLの拡張です。

## 関連項目

ALTER SEQUENCE, DROP SEQUENCE

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