適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
建立順序物件,並指定其屬性。 序列是使用者定義之結構描述繫結的物件,該物件會根據建立序列所使用的規格產生一連串的數值。 數值序列會在定義的間隔依照遞增或遞減順序來產生,而且在用完時可設定為重新啟動 (循環)。
與身分資料行不同,序列不會與特定資料表相關聯。 應用程式會參考順序物件,以擷取它的下一個值。 順序與資料表之間的關聯性是由應用程式所控制。 使用者的應用程式可以參考序列物件,並協調跨越多個資料列和資料表的值。
不同於插入列時產生的身分直欄值,應用程式可以透過呼叫 NEXT VALUE FOR來取得下一個序號,而不插入列。 您可以使用 sp_sequence_get_range 一次取得多個序號。
如需同時 CREATE SEQUENCE 使用 和 NEXT VALUE FOR 函式的資訊和案例,請參閱 序號。
語法
CREATE SEQUENCE [ schema_name . ] sequence_name
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH <constant> ]
[ INCREMENT BY <constant> ]
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]
引數
sequence_name
指定資料庫中順序的唯一識別名稱。 類型是 sysname。
[ built_in_integer_type | 用戶defined_integer_type ]
順序可以定義為任何整數類型。 允許使用下列類型。
- tinyint - 範圍為 0 到 255
- smallint - 範圍為 -32,768 到 32,767
- int - 範圍為 -2,147,483,648 到 2,147,483,647
- bigint - 範圍為 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
- 小數位數為 0 的 decimal 和 numeric。
- 以其中一個允許類型為基礎的任何使用者定義的資料類型 (別名類型)。
如果未提供資料類型,則會使用 bigint 資料類型作為預設值。
START WITH <常數>
順序物件傳回的第一個值。 該 START 值必須是小於或等於序列物件的最大值且大於或等於最小值的值。 新順序物件的預設開始值是遞增順序物件的最小值,是遞減順序物件的最大值。
INCREMENT BY <常數>
用於遞增 (如果為負數) 每次呼叫 NEXT VALUE FOR 函數的序列物件值的值。 如果增量是負值,則序列物件是遞減的;否則,它是遞增的。 增量不能是 0。 新順序物件的預設增量為 1。
[ MINVALUE <常數> |無最小值 ]
指定順序物件的界限。 新序列物件的預設最小值是序列物件之資料類型的最小值。 如果是 tinyint 資料類型,這是零,如果是所有其他資料類型,則為負數。
[ MAXVALUE <常數> |無最大值
指定順序物件的界限。 新序列物件的預設最大值是序列物件之資料類型的最大值。
[ 循環 |無循環 ]
屬性,指定當超出其最小值或最大值時,順序物件應該從最小值 (或是遞減順序物件的最大值) 重新啟動,還是擲回例外狀況。 新序列物件的預設循環選項是 NO CYCLE。
注意
循環 a SEQUENCE 會從最小值或最大值重新開始,而不是從開始值重新啟動。
[ 快取 [ <常數> ] |無緩存 ]
藉由減少產生序號所需的磁碟 IO 數目,對使用順序物件的應用程式提升效能。 預設為 CACHE。
例如,如果選擇快取大小 50,SQL Server 不會快取 50 個個別值。 它只會快取目前值和快取中剩餘的值數量。 這表示,儲存快取所需的記憶體數量永遠是順序物件之資料類型的兩個執行個體。
注意
如果啟用快取選項而不指定快取大小,資料庫引擎會選取大小。 但是,用戶不應依賴選擇的一致性。 Microsoft 可能變更計算快取大小的方法,而不另行通知。
使用該 CACHE 選項建立時,非預期的關機(例如電源故障)可能會導致快取中剩餘的序號遺失。
備註
序號是在目前交易範圍之外產生的。 無論使用序號的交易是認可還是復原,都會取用它們。 只有在填完記錄之後才會出現重複驗證。 這會導致在某些情況下,同一個數字會在建立期間用於多筆記錄,但會識別為重複項目。 如果發生這種情況,而且已將其他自動編號值套用至後續記錄,這會導致自動編號值之間出現間距,這是預期的行為。
快取管理
為了改善效能,SQL Server 會預先配置引數所 CACHE 指定的序號數目。
例如,建立起始值為 1 和快取大小為 15 的新順序。 當需要第一個值時,會從記憶體中提供 1 到 15 的值。 最後一個快取的值 (15) 會寫入至磁碟上的系統資料表。 已使用所有 15 個數字時,下一個要求 (針對數字 16) 將會造成快取重新配置。 新的最後一個快取值 (30) 會寫入系統表格。
如果在您使用 22 個數字之後資料庫引擎停止,記憶體中的下一個預定序號 (23) 會寫入至系統資料表,取代先前儲存的數字。
在 SQL Server 重新啟動,而且需要一個序號之後,會從系統資料表讀取起始數字 (23)。 15 個數字 (23-38) 的快取數量會配置到記憶體,而且下一個非快取數字 (39) 會寫入至系統資料表。
如果資料庫引擎因停電等事件而異常停止,順序會以讀取自系統資料表的數字重新啟動 (39)。 任何配置到記憶體 (但使用者或應用程式從未要求) 的序號都會遺失。 這項功能可能會留下間隙,但保證永遠不會針對單一序列物件發出兩次相同的值,除非它定義為 CYCLE 或手動重新啟動。
快取會透過追蹤目前值 (發出的最後一個值) 和快取中剩餘的值數量來維護在記憶體中。 因此,快取所使用的記憶體數量永遠是順序物件之資料類型的兩個執行個體。
將快取引數 NO CACHE 設為每次使用序列時,都會將現行序列值寫入系統表格。 這可能會因為增加磁碟的存取而降低效能,但是可以減少非預期間距的機會。 如果使用 or NEXT VALUE FOR 函數要求sp_sequence_get_range數字,但仍可能發生間隙,但隨後這些數字要么未使用,要么在未認可的交易中使用。
當序列物件使用選項CACHE時,如果您重新啟動序列物件,或變更 INCREMENT、 、 CYCLEMINVALUEMAXVALUE或快取大小內容,則會導致在變更發生之前將快取寫入系統表格。 然後從目前值開始重新載入快取 (亦即,不會略過任何數字)。 快取大小的變更會立即生效。
CACHE 選項 (快取值可用時)
如果序列物件的記憶體內部快取中有未使用的值可用,則每次要求序列物件產生選項的 CACHE 下一個值時,都會發生下列程式。
- 計算順序物件的下一個值。
- 更新記憶體中順序物件的新的目前值。
- 將計算值傳回給呼叫的陳述式。
CACHE 快取耗盡時的選項
如果快取已用盡,每次要求序列物件以產生選項的 CACHE 下一個值時,都會發生下列程序:
計算順序物件的下一個值。
計算新快取的最後一個值。
鎖定順序物件的系統資料表資料列,而且將步驟 2 中的計算值 (最後一個值) 寫入至系統資料表。 會引發快取耗盡的擴充事件,以通知使用者新的保存值。
無快取選項
每次要求序列物件產生選項的 NO CACHE 下一個值時,都會發生下列程序:
- 計算順序物件的下一個值。
- 將順序物件的新的目前值寫入至系統資料表。
- 將計算值傳回給呼叫的陳述式。
中繼資料
如需有關順序的詳細資訊,請查詢 sys.sequences。
安全性
權限
需要 、 CREATE SEQUENCE或 ALTER 的許可權CONTROL。SCHEMA
- db_owner 和 db_ddladmin 固定資料庫角色的成員可以建立、變更及捨棄序列物件。
- db_owner 和 db_datawriter 固定資料庫角色的成員可以讓序列物件產生數字來更新序列物件。
下列範例會授與使用者 AdventureWorks\Larry 在結構描述中 Test 建立序列的權限。
GRANT CREATE SEQUENCE
ON SCHEMA::Test TO [AdventureWorks\Larry];
可以使用陳述式來 ALTER AUTHORIZATION 轉移序列物件的所有權。
如果序列使用使用者定義的資料類型,則序列的建立者必須具有 REFERENCES 該類型的許可權。
稽核
若要稽核 CREATE SEQUENCE,請監控 SCHEMA_OBJECT_CHANGE_GROUP.
範例
如需建立序列及使用 NEXT VALUE FOR 函數產生序號的範例,請參閱 序號。
下列大部分的範例會在名為 Test 的結構描述中建立順序物件。
若要建立 Test 結構描述,請執行下列陳述式。
CREATE SCHEMA Test;
GO
A. 建立增加 1 的序列
在下列範例中,Thierry 會建立名為 CountBy1 的序列,每次使用時都會增加 1。
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1;
GO
B. 建立減少 1 的序列
下列範例從 0 開始,每次使用時都會計入負數 1。
CREATE SEQUENCE Test.CountByNeg1
START WITH 0
INCREMENT BY -1;
GO
C. 建立增加 5 的序列
下列範例會建立每次使用時增加 5 的序列。
CREATE SEQUENCE Test.CountBy1
START WITH 5
INCREMENT BY 5;
GO
D. 建立以指定數字開頭的序列
在匯入資料表之後,Thierry 發現使用的最高識別碼值是 24,328。 Thierry 需要一個產生從 24,329 開始的數字的序列。 下列程式碼會建立開頭為 24,329 且遞增量為 1 的順序。
CREATE SEQUENCE Test.ID_Seq
START WITH 24329
INCREMENT BY 1;
GO
E. 使用預設值建立序列
下列範例會建立使用預設值的順序。
CREATE SEQUENCE Test.TestSequence;
執行下列陳述式,以檢視順序的屬性。
SELECT *
FROM sys.sequences
WHERE name = 'TestSequence';
輸出的部分清單示範預設值。
| 輸出 | 預設值 |
|---|---|
start_value |
-9223372036854775808 |
increment |
1 |
minimum_value |
-9223372036854775808 |
maximum_value |
9223372036854775807 |
is_cycling |
0 |
is_cached |
1 |
current_value |
-9223372036854775808 |
F. 建立具有特定資料類型的序列
下列範例會建立使用 smallint 資料類型而且在 -32,768 到 32,767 範圍內的順序。
CREATE SEQUENCE SmallSeq
AS SMALLINT;
G. 使用所有引數建立序列
下列範例會建立使用 decimal 資料類型、在 0 到 255 範圍內,而且名為 DecSeq 的順序。 順序開頭為 125,而且每次產生數字時會遞增 25。 因為順序設定為循環,所以當值超過最大值 200 時,順序會從最小值 100 重新啟動。
CREATE SEQUENCE Test.DecSeq
AS DECIMAL (3, 0)
START WITH 125
INCREMENT BY 25
MINVALUE 100
MAXVALUE 200
CYCLE
CACHE 3;
執行下列陳述式以查看第一個值,即 START WITH 選項值 125。
SELECT NEXT VALUE FOR Test.DecSeq;
再執行陳述式三次,以傳回 150、175 和 200。
重新執行陳述式,以查看開始值循環回到 MINVALUE 選項值 100。
執行下列程式碼,以確認快取大小,並查看目前的值。
SELECT cache_size, current_value
FROM sys.sequences
WHERE name = 'DecSeq';