資料表的主鍵若為流水號,手動維護極易衝突。SQL Server 識別欄(Identity Column)內建自動遞增機制,解決並發插入唯一性難題。
IDENTITY(1,1) → 種子 1、遞增 1SET IDENTITY_INSERT ON)


CREATE TABLE dbo.Orders (
OrderID INT IDENTITY(1000, 1) PRIMARY KEY, -- 從 1000 開始
OrderDate DATETIME2 DEFAULT SYSUTCDATETIME(),
CustomerID INT NOT NULL
);
| 需求 | 指令 | 備註 |
|---|---|---|
| 取得最後插入的識別值 | SCOPE_IDENTITY() | 範圍安全,優於 @@IDENTITY |
| 重置種子(下一筆從 1 開始) | DBCC CHECKIDENT('Table', RESEED, 0); | TRUNCATE 會自動重置 |
| 允許手動指定識別值 | SET IDENTITY_INSERT Table ON; INSERT ...; SET IDENTITY_INSERT Table OFF; | 僅限單一 Session,需具備權限 |
| 查看目前種子/遞增 | SELECT IDENT_SEED('Table'), IDENT_INCR('Table'); |
多用戶同時 INSERT 時,SQL Server 透過內部鎖機制(Latch + 輕量級鎖)分配唯一識別值,無需應用層加鎖或序列表,效能極高。識別值分配後即使交易回滾,該值也不會重用(會產生間隙),這是設計使然,非錯誤。
SEQUENCE 物件:跨表共享號碼、可循環、可快取、不綁定特定欄位,適合分散式號碼生成場景。
CREATE SEQUENCE dbo.OrderSeq AS BIGINT START WITH 1 INCREMENT BY 1 CACHE 100;
-- 使用
INSERT INTO Orders (OrderID, ...) VALUES (NEXT VALUE FOR dbo.OrderSeq, ...);