身分識別欄位 讓資料庫自動產生連續唯一值 (如流水號、主鍵),免除應用程式手動管理 ID 的負擔。本文涵蓋建立、取值、重置種子、SSMS 圖形化操作與常見陷阱。
tinyint, smallint, int, bigint, decimal(p,0), numeric(p,0)CREATE TABLE dbo.UserInfor ( UserID INT IDENTITY(100, 2) NOT NULL, -- 起始 100,遞增 2 UserName NCHAR(10) NOT NULL );
IDENTITY(seed, increment):seed 為第一筆資料值,increment 為後續每筆遞增量。
| 方法 | 範圍 | 說明 |
|---|---|---|
@@IDENTITY | Session 級 | 回傳當前 Session 最後產生的身分識別值,含觸發器產生的其他表 ID,易造成誤判 |
SCOPE_IDENTITY() | Scope 級 | 推薦:僅回傳當前範圍 (預存程序/觸發器/批次) 產生的值,不受觸發器影響 |
IDENT_CURRENT('table_name') | 全域/表級 | 回傳指定表最後產生的值,不限 Session,高併發下不可用於取得自己的 ID |
INSERT INTO dbo.UserInfor (UserName) VALUES ('張三');
SELECT SCOPE_IDENTITY() AS NewID; -- 最佳實踐
-- 將種子重置為 0,下一筆插入將為 0 + increment
DBCC CHECKIDENT ('UserInfor', RESEED, 0);
TRUNCATE TABLE 會自動重置種子為建立時的初始值DELETE 不會 重置種子,續號遞增DELETE 導致 ID 不連續屬正常現象,若業務要求連續請改用序號表或應用層管理CREATE TABLE mytest (
id INT PRIMARY KEY IDENTITY(1,1),
name VARCHAR(20) UNIQUE NOT NULL,
Age TINYINT,
notetime SMALLDATETIME DEFAULT GETDATE()
);
INSERT INTO mytest (name, age) VALUES ('張三', 20);
INSERT INTO mytest (name, age) VALUES ('李四', 20);
SELECT SCOPE_IDENTITY(); -- 取得最後新增的 id
INT 上限 21 億,BIGINT 上限 922 兆,實務極難用盡。若真用盡需變更資料型別或重新設計。SET IDENTITY_INSERT table_name ON,插入完成後記得 OFF。