ALTER TABLE 表名 ADD 欄位名 INT IDENTITY(1,1) NOT NULL;
IDENTITY(seed, increment) 參數說明:
IDENTITY(100, 5) 表示從 100 開始,每次 +5(100, 105, 110...)
| 特性 | 說明 |
|---|---|
| 唯一性 | 不保證唯一(需搭配 PRIMARY KEY 或 UNIQUE 約束) |
| 不可為 NULL | 隱含 NOT NULL |
| 無法手動插入值 | 需 `SET IDENTITY_INSERT 表名 ON` 才允許明確插入 |
| 間隙可能存在 | 交易回滾、刪除資料會造成號碼跳號 |
| 重設種子 | `DBCC CHECKIDENT ('表名', RESEED, 新種子值)` |
| 取得最新身分識別值 | `SCOPE_IDENTITY()`(推薦)、`@@IDENTITY`、`IDENT_CURRENT('表名')` |
-- 允許明確插入身分識別值
SET IDENTITY_INSERT dbo.Users ON;
INSERT INTO dbo.Users (UserID, UserName) VALUES (999, 'Admin');
SET IDENTITY_INSERT dbo.Users OFF;
-- 重設種子(下一筆將從 1000 開始)
DBCC CHECKIDENT ('dbo.Users', RESEED, 999);
-- 查詢當前種子值
DBCC CHECKIDENT ('dbo.Users', NORESEED);
若使用 SQL Server 2012 或更新版本,建議考慮 SEQUENCE 物件:
CREATE SEQUENCE dbo.Seq_UserID AS INT START WITH 1 INCREMENT BY 1;
-- 使用
INSERT INTO dbo.Users (UserID, UserName) VALUES (NEXT VALUE FOR dbo.Seq_UserID, 'NewUser');
SQL Server 2008 以 IDENTITY 欄位實現自動遞增,T-SQL 與 SSMS 圖介兩種方式皆可。注意間隙特性、重設種子語法,以及 2012+ 版本可升級使用 SEQUENCE 獲得更強彈性。