

# `CREATE SEQUENCE`
<a name="create-sequence-syntax-support"></a>

`CREATE SEQUENCE` – 新しいシーケンスジェネレーターを定義します。

**重要**  
PostgreSQL では、`CACHE` の指定はオプションで、デフォルトは 1 です。Amazon Aurora DSQL などの分散システムでは、シーケンスオペレーションには調整が必要であり、キャッシュサイズが 1 の場合、同時実行数が多いと調整オーバーヘッドが増加する可能性があります。キャッシュ値を大きくすると、ローカルに事前割り当てられた範囲からシーケンス番号を提供できるようになり、スループットが向上しますが、未使用の予約値が失われ、ギャップと順序付けのずれがより顕著になる可能性があります。アプリケーションによって割り当て順序とスループットに対する感度が異なるため、Amazon Aurora DSQL では `CACHE` を明示的に指定する必要があり、現在は `CACHE = 1` または `CACHE >= 65536` をサポートしており、厳密にシーケンシャルな生成に近い割り当て動作と、高度な同時実行ワークロード向けに最適化された割り当て動作を明確に区別しています。  
`CACHE >= 65536` の場合、シーケンス値は一意であることが保証されますが、セッション間で厳密に増加順で生成されない可能性があり、特にキャッシュされた値が完全に消費されていない場合にギャップが発生する可能性があります。これらの特性は、同時使用時のキャッシュされたシーケンスの PostgreSQL セマンティクスと一致しています。どちらのシステムも個別の値が保証されますが、セッション間での厳密な連続順序は保証されません。  
単一のクライアントセッション内では、特に明示的なトランザクションの外部では、シーケンス値が常に厳密に増加するとは限りません。この動作は、接続プーリングを使用する PostgreSQL デプロイに似ています。`CACHE = 1` を使用するか、明示的なトランザクション内でシーケンス値を取得することで、シングルセッションの PostgreSQL 環境に近い割り当て動作を実現できます。  
`CACHE = 1` の場合、シーケンスの割り当ては PostgreSQL のキャッシュされていないシーケンス動作に従います。  
ワークロードパターンに基づいてシーケンスを使用する最適な方法のガイダンスについては、「[シーケンスと ID 列の使用](sequences-identity-columns-working-with.md)」を参照してください。

## サポートされている構文
<a name="create-sequence-supported-syntax"></a>

```
CREATE SEQUENCE [ IF NOT EXISTS ] name CACHE cache
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ [ NO ] CYCLE ]
    [ START [ WITH ] start ]
    [ OWNED BY { table_name.column_name | NONE } ]

where data_type is BIGINT
      and cache = 1 or cache >= 65536
```

## 説明
<a name="create-sequence-description"></a>

`CREATE SEQUENCE` は新しいシーケンス番号ジェネレーターを作成します。これには、*name* という名前の新しい特殊な単一行テーブルの作成と初期化が含まれます。ジェネレーターは、コマンドを発行するユーザーによって所有されます。

スキーマ名が指定されている場合は、指定されたスキーマ内にシーケンスが作成されます。指定しない場合、現在のスキーマに作成されます。シーケンスの名前は、同じスキーマ内の他のリレーション (テーブル、シーケンス、インデックス、ビュー、マテリアライズドビュー、または外部テーブル) の名前とは異なる必要があります。

シーケンスを作成したら、関数 `nextval`、`currval`、および `setval` を使用してシーケンスを操作します。これらの関数については、「[シーケンス操作関数](sequence-functions-syntax-support.md)」で文書化されています。

シーケンスを直接更新することはできませんが、次のようなクエリを使用できます。

```
SELECT * FROM name;
```

シーケンスの一部のパラメータと現在の状態を調べます。特に、シーケンスの `last_value` フィールドには、任意のセッションによって割り当てられた最後の値が表示されます。(もちろん、他のセッションがアクティブに `nextval` 呼び出しを実行している場合、この値は出力される時点までに古くなっている可能性があります。) *increment* や *maxvalue* などの他のパラメータは、`pg_sequences` ビューで確認できます。

## パラメータ
<a name="create-sequence-parameters"></a>

**`IF NOT EXISTS`**  
同じ名前のリレーションが既に存在する場合は、エラーをスローしません。この場合、通知が発行されます。既存のリレーションが、作成されたシーケンスと似ている保証はありません。シーケンスではない可能性があることに注意してください。

***.name***  
作成するシーケンスの名前 (オプションでスキーマ修飾)。

***data\$1type***  
オプションの `AS data_type` 句は、シーケンスのデータ型を指定します。有効な値は `bigint` です。`bigint` がデフォルトです。データ型によって、シーケンスのデフォルトの最小値と最大値が決まります。

***増分***  
オプションの `INCREMENT BY increment` 句では、新しい値を作成するために現在のシーケンス値に追加する値を指定します。正の値を指定すると昇順のシーケンスになり、負の値を指定すると降順のシーケンスになります。デフォルト値は 1 です。

***minvalue* / `NO MINVALUE`**  
オプションの `MINVALUE minvalue` 句は、シーケンスが生成できる最小値を決定します。この句が指定されていない場合、または `NO MINVALUE` が指定されている場合は、デフォルトが使用されます。昇順シーケンスのデフォルトは 1 です。降順シーケンスのデフォルトは、データ型の最小値です。

***maxvalue* / `NO MAXVALUE`**  
オプションの `MAXVALUE maxvalue` 句は、シーケンスの最大値を決定します。この句が指定されていない場合、または `NO MAXVALUE` が指定されている場合は、デフォルト値が使用されます。昇順シーケンスのデフォルトは、データ型の最大値です。降順シーケンスのデフォルトは -1 です。

**`CYCLE` / `NO CYCLE`**  
`CYCLE` オプションを使用すると、昇順または降順のシーケンスがそれぞれ *maxvalue* または *minvalue* に達したときにシーケンスをラップアラウンドすることができます。制限に達すると、生成される次の数値はそれぞれ *minvalue* または *maxvalue* になります。  
`NO CYCLE` が指定された場合、シーケンスが最大値に達した後の `nextval` の呼び出しではエラーが返されます。`CYCLE` または `NO CYCLE` のどちらも指定されていない場合は、`NO CYCLE` がデフォルトです。

***開始***  
オプションの `START WITH start` 句を使用すると、シーケンスを任意の場所から開始できます。デフォルトの開始値は、昇順シーケンスの場合は *minvalue*、降順シーケンスの場合は *maxvalue* です。

***キャッシュ***  
`CACHE cache` 句は、アクセスを高速化するために事前に割り当ててメモリに保存するシーケンス番号の数を指定します。Aurora DSQL の `CACHE` の許容値は 1 または 65536 以上の任意の数値です。最小値は 1 です (一度に生成できる値は 1 つだけです。つまり、キャッシュはありません)。

**`OWNED BY table_name.column_name` / `OWNED BY NONE`**  
`OWNED BY` オプションを使用すると、シーケンスが特定のテーブル列に関連付けられるため、その列 (またはそのテーブル全体) が削除されると、シーケンスも自動的に削除されます。指定されたテーブルは、シーケンスと同じ所有者を持ち、同じスキーマ内にある必要があります。デフォルトの `OWNED BY NONE` は、そのような関連付けがないことを指定します。

## 注意事項
<a name="create-sequence-notes"></a>

[`DROP SEQUENCE`](drop-sequence-syntax-support.md) を使用してシーケンスを削除します。

シーケンスは `bigint` 算術に基づいているため、範囲は 8 バイト整数の範囲 (-9223372036854775808～9223372036854775807) を超えることはできません。

`nextval` および `setval` 呼び出しはロールバックされないため、シーケンス番号の「ギャップレス」割り当てが必要な場合は、シーケンスオブジェクトを使用できません。

各セッションは、シーケンスオブジェクトへの 1 回のアクセス中に連続するシーケンス値を割り当てキャッシュし、それに応じてシーケンスオブジェクトの `last_value` を増やします。その後、そのセッション内での次の *cache*-1 の `nextval` の使用は、シーケンスオブジェクトにアクセスせずに、単純に事前に割り当てられた値を返します。したがって、セッション内で割り当てられたが使用されなかった番号は、そのセッションが終了すると失われ、シーケンスに「ホール」が発生します。

さらに、複数のセッションに個別のシーケンス値が割り当てられることが保証されていますが、すべてのセッションを考慮すると、値が順序どおりに生成されない可能性があります。例えば、*cache* 設定が 10 の場合、セッション A は値 1..10 を予約して `nextval`=1 を返し、セッション A が `nextval`=2 を生成する前に、セッション B が値 11..20 を予約して `nextval`=11 を返す場合があります。したがって、*cache* 設定が 1 の場合、`nextval` 値が順番に生成されると想定しても問題ありません。*cache* 設定が 1 より大きい場合は、`nextval` 値がすべて異なる値であることのみを想定する必要があり、純粋に順番に生成されると想定するべきではありません。また、`last_value` は、`nextval` によって返されたかどうかにかかわらず、任意のセッションによって予約された最新の値を反映します。

もう 1 つの考慮事項は、このようなシーケンスで実行された `setval` は、キャッシュされた事前割り当て値を使い切るまで、他のセッションによって認識されないことです。

## 例
<a name="create-sequence-examples"></a>

101 から始まる `serial` という昇順のシーケンスを作成します。

```
CREATE SEQUENCE serial CACHE 65536 START 101;
```

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

```
SELECT nextval('serial');

 nextval
---------
     101
```

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

```
SELECT nextval('serial');

 nextval
---------
     102
```

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

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

`setval` を使用してシーケンスを特定の値にリセットします。

```
SELECT setval('serial', 200);
SELECT nextval('serial');

 nextval
---------
     201
```

## 互換性
<a name="create-sequence-compatibility"></a>

`CREATE SEQUENCE` は SQL 標準に準拠していますが、以下の例外があります。
+ 次の値の取得は、標準の `NEXT VALUE FOR` 式ではなく `nextval()` 関数を使用して行われます。
+ `OWNED BY` 句は PostgreSQL 拡張機能です。