

# アイデンティティ列
<a name="sequences-identity-columns-overview"></a>

**重要**  
ID 列を使用する場合は、キャッシュ値を慎重に検討する必要があります。詳細については、「[`CREATE SEQUENCE`](create-sequence-syntax-support.md)」ページの重要なコールアウトを参照してください。  
ワークロードパターンに基づいて ID 列を使用する最適な方法のガイダンスについては、「[シーケンスと ID 列の使用](sequences-identity-columns-working-with.md)」を参照してください。

ID 列は、暗黙的なシーケンスから自動的に生成される特殊な列です。キー値の生成に使用できます。ID 列を作成するには、[`CREATE TABLE`](create-table-syntax-support.md) で `GENERATED ... AS IDENTITY` 句を使用します。次に例を示します。

```
CREATE TABLE people (
    id bigint GENERATED ALWAYS AS IDENTITY (CACHE 70000),
    ...
);
```

または、以下を実行します。

```
CREATE TABLE people (
    id bigint GENERATED BY DEFAULT AS IDENTITY (CACHE 70000),
    ...
);
```

詳細については、「[`CREATE TABLE`](create-table-syntax-support.md)」を参照してください。

ID 列を持つテーブルに対して `INSERT` コマンドが実行され、ID 列に値が明示的に指定されていない場合、暗黙的なシーケンスによって生成された値が挿入されます。例えば、前述の定義で、追加の適切な列を想定して、次のように記述します。

```
INSERT INTO people (name, address) VALUES ('A', 'foo');
INSERT INTO people (name, address) VALUES ('B', 'bar');
```

`id` 列の値が 1 から始まり、次のテーブルデータが生成されます。

```
 id | name | address
----+------+---------
  1 | A    | foo
  2 | B    | bar
```

または、値の代わりにキーワード `DEFAULT` を指定して、シーケンス生成値を明示的にリクエストすることもできます。

```
INSERT INTO people (id, name, address) VALUES (DEFAULT, 'C', 'baz');
```

同様に、キーワード `DEFAULT` は `UPDATE` コマンドでも使用できます。

したがって、多くの点で、ID 列はデフォルト値を持つ列のように動作します。

列定義の `ALWAYS` 句と `BY DEFAULT` 句は、`INSERT` コマンドと `UPDATE` コマンドでユーザーが明示的に指定した値がどのように処理されるかを決定します。`INSERT` コマンドで `ALWAYS` を選択した場合、ユーザー指定の値は、`INSERT` ステートメントで `OVERRIDING SYSTEM VALUE` が指定されている場合にのみ受け入れられます。`BY DEFAULT` が選択されている場合、ユーザー指定の値が優先されます。したがって、`BY DEFAULT` を使用すると、デフォルト値に似た動作になります。デフォルト値は明示的な値で上書きできますが、`ALWAYS` を使用すると、明示的な値が誤って挿入されることに対する保護が強化されます。

ID 列のデータ型は、シーケンスでサポートされているデータ型のいずれかである必要があります。(「[`CREATE SEQUENCE`](create-sequence-syntax-support.md)」を参照してください。) 関連付けられたシーケンスのプロパティは、ID 列の作成時に指定することも (「[`CREATE TABLE`](create-table-syntax-support.md)」を参照)、後で変更することもできます (「[`ALTER TABLE`](alter-table-syntax-support.md)」を参照)。

ID 列は自動的に `NOT NULL` とマークされます。ただし、ID 列では一意性が保証されません。(シーケンスは通常一意の値を返しますが、前述のように、シーケンスをリセットしたり、ID 列に値を手動で挿入したりすることもできます)。一意性は、`PRIMARY KEY` または `UNIQUE` 制約を使用して強制する必要があります。