

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 身分資料欄
<a name="sequences-identity-columns-overview"></a>

**重要**  
使用身分資料欄時，應仔細考慮快取值。如需詳細資訊，請參閱 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 頁面上的重要標註。  
如需如何根據工作負載模式最佳使用身分資料欄的指引，請參閱 [使用序列和身分資料欄](sequences-identity-columns-working-with.md)。

身分資料欄是從隱含序列自動產生的特殊資料欄。它可用於產生索引鍵值。若要建立身分資料欄，請使用 中的 `GENERATED ... AS IDENTITY`子句[`CREATE TABLE`](create-table-syntax-support.md)，例如：

```
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');
```

同樣地， 關鍵字`DEFAULT`可用於 `UPDATE` 命令。

因此，在許多方面，身分資料欄的行為就像具有預設值的資料欄。

資料欄定義`BY DEFAULT`中的 子句 `ALWAYS`和 會決定在 `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` 限制條件強制執行唯一性。