

# 标识列
<a name="sequences-identity-columns-overview"></a>

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

标识列是根据隐式序列自动生成的特殊列。它可以用来生成键值。要创建标识列，请在 [`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)。

如果对带有标识列的表执行 `INSERT` 命令，但没有为标识列显式指定任何值，则会插入由隐式序列生成的值。例如，使用前面的定义并假设其它适当的列，编写：

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

将为从 1 开始的 `id` 列生成值并生成下面的表数据：

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

或者，可以指定关键字 `DEFAULT` 来代替值，以显式请求序列生成的值：

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

同样，可以在 `UPDATE` 命令中使用关键字 `DEFAULT`。

这样，在许多方面，标识列的行为类似于具有默认值的列。

列定义中的子句 `ALWAYS` 和 `BY DEFAULT` 决定了在 `INSERT` 和 `UPDATE` 命令中如何显式处理用户指定的值。在 `INSERT` 命令中，如果选择了 `ALWAYS`，则只有在 `INSERT` 语句指定 `OVERRIDING SYSTEM VALUE` 时才接受用户指定的值。如果选择了 `BY DEFAULT`，则优先使用用户指定的值。因此，使用 `BY DEFAULT` 会产生更类似于使用默认值时的行为，其中，默认值可以由显式值覆盖，而 `ALWAYS` 可提供更多保护，以防止意外插入显式值。

标识列的数据类型必须为序列支持的数据类型之一。（请参见 [`CREATE SEQUENCE`](create-sequence-syntax-support.md)。） 关联序列的属性可以在创建标识列时指定（请参阅 [`CREATE TABLE`](create-table-syntax-support.md)），也可以在之后更改（请参阅 [`ALTER TABLE`](alter-table-syntax-support.md)）。

标识列会自动标记为 `NOT NULL`。但是，身份列并不能保证唯一性。（序列通常返回唯一值，但可以重置序列，也可以手动将值插入标识列中，如前面所述。） 需要使用 `PRIMARY KEY` 或 `UNIQUE` 约束来强制实施唯一性。