

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

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

序列和身分資料欄會產生整數值，並在需要精簡或人類可讀取的識別符時很有用。這些值涉及 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 文件中所述的配置和快取行為。

**Topics**
+ [序列處理函式](sequence-functions-syntax-support.md)
+ [身分資料欄](sequences-identity-columns-overview.md)
+ [使用序列和身分資料欄](sequences-identity-columns-working-with.md)

# 序列處理函式
<a name="sequence-functions-syntax-support"></a>

本節說明在序列物件上操作的函數，也稱為序列產生器或僅序列。序列物件是使用 建立的特殊單列資料表[`CREATE SEQUENCE`](create-sequence-syntax-support.md)。序列物件通常用於為資料表的資料列產生唯一識別符。序列函數提供簡單、多使用者安全的方法來從序列物件取得連續的序列值。

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


| 函式 | Description | 
| --- | --- | 
| nextval ( regclass ) → bigint | 將序列物件推進到下一個值，並傳回該值。這是以原子方式完成的：即使多個工作階段nextval同時執行，每個工作階段都會安全地收到不同的序列值。如果序列物件已使用預設參數建立，後續nextval呼叫將傳回以 1 開頭的遞增值。您可以在 [`CREATE SEQUENCE`](create-sequence-syntax-support.md)命令中使用適當的參數來取得其他行為。此函數需要 序列上的 USAGE或 UPDATE權限。 | 
| setval ( regclass, bigint [, boolean ] ) → bigint | 設定序列物件的目前值，並選擇性地設定其is\$1called旗標。雙參數形式會將序列的 last\$1value 欄位設定為指定的值，並將其is\$1called欄位設定為 true，這表示下一個 nextval會在傳回值之前推進序列。將報告的值currval也會設定為指定的值。在三參數形式中， is\$1called 可以設定為 true或 false。 true 具有與雙參數形式相同的效果。如果設定為 false，下一個 nextval會傳回確切指定的值，而序列提升會從下列 開始nextval。此外，此處currval不會變更 回報的值。例如：<pre>SELECT setval('myseq', 42);           -- Next nextval will return 43<br />SELECT setval('myseq', 42, true);     -- Same as above<br />SELECT setval('myseq', 42, false);    -- Next nextval will return 42</pre> 傳回的結果setval只是其第二個引數的值。此函數需要序列UPDATE的權限。 | 
| currval ( regclass ) → bigint | 傳回 最近在目前工作階段中nextval針對此序列取得的值。（如果在此工作階段中nextval從未針對此序列呼叫 ，則會報告錯誤。) 由於這會傳回工作階段本機值，因此無論其他工作階段是否nextval因為目前工作階段而執行，都會提供可預測的答案。此函數需要 序列上的 USAGE或 SELECT權限。 | 
| lastval () → bigint | 傳回目前交易nextval中 最近傳回的值。此函數與 相同currval，除了不將序列名稱作為引數，而是參考目前交易中nextval最近套用到的任何序列。lastval 如果目前交易中nextval尚未呼叫 ，則呼叫 時發生錯誤。此函數對上次使用的序列需要 USAGE或 SELECT權限。 | 

**警告**  
如果呼叫交易稍後中止，`nextval`則不會回收 取得的值以供重複使用。這表示交易中止或資料庫當機可能會導致指派值序列的差距。這也可能在沒有交易中止的情況下發生。例如，`INSERT`具有 `ON CONFLICT`子句的 會先計算to-be-inserted元組，包括進行任何必要的`nextval`呼叫，然後再偵測任何可能導致其遵循`ON CONFLICT`規則的衝突。因此，Aurora DSQL 的序列物件*無法用來取得「無間隙」序列*。  
同樣地，其他交易`setval`也會立即看到 所做的序列狀態變更，而且如果呼叫交易轉返，則不會復原。

序列函數要操作的序列由引數指定，該`regclass`引數只是`pg_class`系統目錄中序列的 OID。不過，您不需要手動查詢 OID，因為`regclass`資料類型的輸入轉換器會為您執行工作。如需詳細資訊，請參閱[物件識別符類型的](https://www.postgresql.org/docs/current/datatype-oid.html) PostgreSQL 文件。

# 身分資料欄
<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` 限制條件強制執行唯一性。

# 使用序列和身分資料欄
<a name="sequences-identity-columns-working-with"></a>

本節協助您了解如何根據工作負載模式，以最佳方式使用序列和身分資料欄。

**重要**  
如需配置和快取行為的詳細資訊，請參閱 [`CREATE SEQUENCE`](create-sequence-syntax-support.md)頁面上的重要標註。

## 選擇識別符類型
<a name="sequences-identity-columns-choosing-identifier-types"></a>

Amazon Aurora DSQL 支援 UUID 型識別符，以及使用序列或身分資料欄產生的整數值。這些選項的配置方式，以及它們在負載下擴展的方式有所不同。

UUID 值可在不協調的情況下產生，非常適合經常或在許多工作階段之間建立識別符的工作負載。由於 Amazon Aurora DSQL 專為分散式操作而設計，因此避免協調通常很有幫助。因此，建議使用 UUIDs做為預設識別符類型，特別是對於可擴展性很重要且不需要嚴格排序識別符的工作負載中的主要金鑰。

序列和身分資料欄會產生小型整數值，方便人類讀取識別符、報告和外部界面。當基於可用性或整合原因而偏好數值識別符時，請考慮使用序列或身分資料欄搭配 UUID 型識別符。當需要整數序列或身分值時，選擇適當的快取大小會成為工作負載設計的重要部分。如需選擇快取大小的指引，請參閱下一節。

## 選擇快取大小
<a name="sequences-identity-columns-choosing-cache-size"></a>

選取適當的快取值是有效使用序列和身分資料欄的重要部分。快取設定會決定識別碼配置在負載下的行為方式，同時影響系統輸送量和值反映配置順序的緊密程度。

**較大的快取大小`CACHE >= 65536`非常適合下列情況：**
+ 以高頻率產生識別符
+ 許多工作階段同時插入
+ 工作負載可以容忍差距和可見的排序效果

例如，大量事件擷取工作負載 （例如 IoT 或遙測），以及作業執行 IDs、支援案例參考或內部順序號碼等操作識別符，通常會受益於較大的快取大小，其中經常產生識別符，而且不需要嚴格排序。

**在下列情況下，快取大小為 1 會更好地對齊：**
+ 配置率相對較低
+ 預期識別符會隨著時間更密切地遵循配置順序
+ 將差距降至最低比最大輸送量更重要

指派帳戶或參考號碼等工作負載，其中識別符的產生頻率較低，而且需要更接近的排序，與快取大小 1 更一致。