

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

# `CREATE SEQUENCE`
<a name="create-sequence-syntax-support"></a>

`CREATE SEQUENCE` — 定義新的序列產生器。

**重要**  
在 PostgreSQL 中，指定 `CACHE` 是選用的，預設為 1。在 Amazon Aurora DSQL 等分散式系統中，序列操作涉及協調，快取大小為 1 可以增加高並行下的協調負荷。雖然較大的快取值允許從本機預先配置的範圍提供序號，提高輸送量，但未使用的預留值可能會遺失，使得差距和排序效果更加明顯。由於應用程式對配置排序的敏感度與輸送量不同，因此 Amazon Aurora DSQL `CACHE` 需要明確指定，且目前支援 `CACHE = 1`或 `CACHE >= 65536`，提供配置行為之間的明確區別，更接近針對高度並行工作負載進行最佳化的嚴格循序產生和配置。  
當 時`CACHE >= 65536`，序列值仍保證是唯一的，但可能不會在工作階段間以嚴格增加的順序產生，並且可能發生差距，特別是快取值未完全耗用時。這些特性與同時使用下快取序列的 PostgreSQL 語意一致，其中兩個系統都保證不同的值，但不保證跨工作階段嚴格循序排序。  
在單一用戶端工作階段中，序列值可能不會總是出現嚴格增加，尤其是在明確交易之外。此行為類似於使用連線集區的 PostgreSQL 部署。接近單一工作階段 PostgreSQL 環境的配置行為，可以透過在明確交易中使用 `CACHE = 1`或 取得序列值來達成。  
使用 `CACHE = 1`，序列配置遵循 PostgreSQL 的非快取序列行為。  
如需如何根據工作負載模式以最佳方式使用序列的指引，請參閱 [使用序列和身分資料欄](sequences-identity-columns-working-with.md)。

## 支援的語法
<a name="create-sequence-supported-syntax"></a>

```
CREATE SEQUENCE [ IF NOT EXISTS ] name CACHE cache
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ [ NO ] CYCLE ]
    [ START [ WITH ] start ]
    [ OWNED BY { table_name.column_name | NONE } ]

where data_type is BIGINT
      and cache = 1 or cache >= 65536
```

## Description
<a name="create-sequence-description"></a>

`CREATE SEQUENCE` 會建立新的序號產生器。這包括使用*名稱*建立和初始化新的特殊單列資料表。產生器將由發出 命令的使用者擁有。

如果指定結構描述名稱，則會在指定的結構描述中建立序列。否則會在目前的結構描述中建立。序列名稱必須與相同結構描述中任何其他關係 （資料表、序列、索引、檢視、具體化檢視或外部資料表） 的名稱不同。

建立序列之後，您可以使用函數 `nextval`、 `currval`和 `setval` 來操作序列。這些函數會記錄在 中[序列處理函式](sequence-functions-syntax-support.md)。

雖然您無法直接更新序列，但您可以使用下列查詢：

```
SELECT * FROM name;
```

檢查序列的某些參數和目前狀態。特別是，序列`last_value`的欄位會顯示任何工作階段配置的最後一個值。（當然，如果其他工作階段正在執行`nextval`呼叫，此值在列印時可能會淘汰。) 您可以在`pg_sequences`檢視中觀察其他參數，例如*增量*和*最大值*。

## Parameters
<a name="create-sequence-parameters"></a>

**`IF NOT EXISTS`**  
如果具有相同名稱的關係已存在，請勿擲回錯誤。在此情況下會發出通知。請注意，無法保證現有關係與已建立的序列類似，甚至可能不是序列。

***name***  
要建立之序列的名稱 （選擇性符合結構描述資格）。

***data\$1type***  
選用的 子句`AS data_type`指定序列的資料類型。有效類型為 `bigint`。 `bigint` 是預設值。資料類型會決定序列的預設最小值和最大值。

***增量***  
選用的 子句會`INCREMENT BY increment`指定要新增至目前序列值的值，以建立新的值。正值將使遞增序列，負值將遞減序列。預設值為 1.

***最小值*/ `NO MINVALUE`**  
選用子句`MINVALUE minvalue`決定序列可以產生的最小值。如果未提供或`NO MINVALUE`指定此子句，則會使用預設值。遞增序列的預設值為 1。遞減序列的預設值為 資料類型的最小值。

***maxvalue* / `NO MAXVALUE`**  
選用子句`MAXVALUE maxvalue`決定序列的最大值。如果未提供或`NO MAXVALUE`指定此子句，則會使用預設值。遞增序列的預設值為 資料類型的最大值。遞減序列的預設值為 -1。

**`CYCLE` / `NO CYCLE`**  
當遞增或遞減序列分別達到*最大值*或*最小值*時， `CYCLE`選項允許序列包裝。如果達到限制，產生的下一個數字將分別是*最小值*或*最大值*。  
如果指定 `NO CYCLE` ，則在序列達到其最大值`nextval`之後對 的任何呼叫都會傳回錯誤。如果未指定 `CYCLE`或 `NO CYCLE` ，`NO CYCLE`則預設為 。

***start***  
選用的 子句`START WITH start`允許序列從任何位置開始。預設的開始值是遞增序列的*最小值*，以及遞減序列的*最大值*。

***快取***  
子句`CACHE cache`指定要預先配置和儲存在記憶體中的序號數量，以加快存取速度。Aurora DSQL `CACHE`中 可接受的值為 1 或任何數字 >= 65536。最小值為 1 （一次只能產生一個值，表示沒有快取）。

**`OWNED BY table_name.column_name` / `OWNED BY NONE`**  
`OWNED BY` 選項會導致序列與特定資料表資料欄相關聯，因此如果捨棄該資料欄 （或其整個資料表），序列也會自動捨棄。指定的資料表必須具有相同的擁有者，且與序列位於相同的結構描述中。預設 `OWNED BY NONE`會指定沒有此類關聯。

## 備註
<a name="create-sequence-notes"></a>

使用 [`DROP SEQUENCE`](drop-sequence-syntax-support.md)移除序列。

序列是以算術為基礎，因此範圍不能超過八位元組整數 (-9223372036854775808 `bigint` 到 9223372036854775807) 的範圍。

由於 `nextval`和 `setval`呼叫永遠不會轉返，如果需要序號的「無間隙」指派，則無法使用序列物件。

每個工作階段都會在一次存取序列物件期間配置和快取連續的序列值，並`last_value`相應地增加序列物件的 。然後，該工作階段`nextval`中的下一個 *cache*-1 使用 只會傳回預先配置的值，而不會接觸序列物件。因此，當工作階段結束時，任何配置但未在工作階段中使用的數字都會遺失，導致序列中出現「洞」。

此外，雖然保證多個工作階段會配置不同的序列值，但當考慮所有工作階段時，可能會不按順序產生這些值。例如，如果*快取*設定為 10，工作階段 A 可能會保留值 1..10 並傳回 `nextval`=1，則工作階段 B 可能會保留值 11..20，並在工作階段 A 產生 `nextval`=2 之前傳回 `nextval`=11。因此，在*快取*設定為一個時，您可以安全地假設`nextval`值是循序產生的；*快取*設定大於一個時，您應該只假設這些`nextval`值都是不同的，而不是完全循序產生。此外， `last_value`也會反映任何工作階段保留的最新值，無論 是否已傳回。 `nextval`

另一個考量是，在此類序列`setval`上執行的 不會被其他工作階段注意到，直到它們用完他們快取的任何預先配置值為止。

## 範例
<a name="create-sequence-examples"></a>

建立名為 的遞增序列`serial`，從 101 開始：

```
CREATE SEQUENCE serial CACHE 65536 START 101;
```

從此序列中選取下一個數字：

```
SELECT nextval('serial');

 nextval
---------
     101
```

從此序列中選取下一個數字：

```
SELECT nextval('serial');

 nextval
---------
     102
```

在 `INSERT`命令中使用此序列：

```
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
```

使用 將序列重設為特定值`setval`：

```
SELECT setval('serial', 200);
SELECT nextval('serial');

 nextval
---------
     201
```

## 相容性
<a name="create-sequence-compatibility"></a>

`CREATE SEQUENCE` 符合 SQL 標準，但有下列例外：
+ 取得下一個值是使用 `nextval()`函數而非標準`NEXT VALUE FOR`表達式來完成。
+ `OWNED BY` 子句是 PostgreSQL 延伸模組。