

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

**注意**  
使用标识列时，应谨慎考虑缓存值。有关更多信息，请参阅 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 页面上的“重要提示”标注。  
有关如何根据工作负载模式以最佳方式使用标识列的指导，请参阅[使用序列和标识列](sequences-identity-columns-working-with.md)。

`GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( sequence_options )` 子句将列创建为*标识列*。它将附加一个隐式序列，在新插入的行中，该列将自动具有序列中分配给它的值。这样的列隐式为 `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`，则系统会为序列选择一个未使用的名称。