

# `CREATE TABLE`
<a name="create-table-syntax-support"></a>

`CREATE TABLE` は、新しいテーブルを定義します。

```
CREATE TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE source_table [ like_option ... ] }
    [, ... ]
] )

where column_constraint is:

[ CONSTRAINT constraint_name ]
{ NOT NULL |
  NULL |
  CHECK ( expression )|
  DEFAULT default_expr |
  GENERATED ALWAYS AS ( generation_expr ) STORED |
  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( sequence_options ) |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters |
  PRIMARY KEY index_parameters |

and table_constraint is:

[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters |
  PRIMARY KEY ( column_name [, ... ] ) index_parameters |

and like_option is:

{ INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | ALL }

index_parameters in UNIQUE, and PRIMARY KEY constraints are:
[ INCLUDE ( column_name [, ... ] ) ]
```

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

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

`GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( sequence_options )` 句は、列を *ID 列*として作成します。暗黙的なシーケンスがアタッチされ、新しく挿入された行の列には、割り当てられたシーケンスの値が自動的に設定されます。このような列は暗黙的に `NOT NULL` です。

`ALWAYS` 句と `BY DEFAULT` 句は、`INSERT` コマンドと `UPDATE` コマンドでユーザーが明示的に指定した値がどのように処理されるかを決定します。

`INSERT` コマンドで `ALWAYS` を選択した場合、ユーザー指定の値は、`INSERT` ステートメントで `OVERRIDING SYSTEM VALUE` が指定されている場合にのみ受け入れられます。`BY DEFAULT` が選択されている場合、ユーザー指定の値が優先されます。

`UPDATE` コマンドで `ALWAYS` を選択した場合、列を `DEFAULT` 以外の値に更新することは拒否されます。`BY DEFAULT` を選択した場合、列は通常どおり更新できます。(`UPDATE` コマンドには `OVERRIDING` 句はありません)。

*sequence\$1options* 句を使用して、シーケンスのパラメータを上書きできます。使用可能なオプションには、[`CREATE SEQUENCE`](create-sequence-syntax-support.md) に表示されているオプションに加えて、`SEQUENCE NAME name` が含まれます。`SEQUENCE NAME` がない場合、システムはシーケンスに未使用の名前を選択します。