SQL Server 2012 (Denali) 增加了 Sequence 功能,可以用來建立流水號。
什麼時候適合用 Sequence 而不是 Identity
- 一個值需要被多張資料表共用,例如跨表的統一流水號。
- 需要預先取得編號的情形(不像 IDENTITY 必須插入資料才能產生)。
- 更細微地控制遞增數值範圍。
特性
- Sequence 屬於資料庫層級,和資料表裡的 Identity 欄位只對該資料表有效是不一樣的。
- 遞增的動作不會受到 Transcation rollback 的影響,就算交易失敗也會保持遞增結果。
語法
顯示目前資料庫裡的 Sequence:
SELECT * FROM sys.sequences
建立新的 Sequence:
CREATE SEQUENCE SequenceTest -- 建立名為 SequenceTest 的 Sequence
START WITH 1 -- 從 1 開始
INCREMENT BY 1 -- 遞增數量
取得 Sequence 的下一個數字:
SELECT NEXT VALUE FOR SequenceTest
修改目前的 Sequence:
ALTER SEQUENCE SequenceTest -- 要修改的 Sequence
RESTART WITH 1 -- 從哪個數字開始
INCREMENT BY 1 -- 遞增數量 (要遞減可以設負數)
MINVALUE 1 -- 設定最小範圍
MAXVALUE 1000000 -- 設定最大範圍
此外,還有 CYCLE
可設定超過最大值時,從最小值重新開始。
參考資料
- [Denali 新特性探險10]Sequence - iT 邦幫忙
- NEXT VALUE FOR (Transact-SQL) - SQL Server - Microsoft Learn
- 序列號 - SQL Server - Microsoft Learn
- sys.sequences (Transact-SQL) - SQL Server - Microsoft Learn
- CREATE SEQUENCE (Transact-SQL) - SQL Server - Microsoft Learn
- ALTER SEQUENCE (Transact-SQL) - SQL Server - Microsoft Learn