在 SQL Server 裡面,如何產生自動遞增的編號呢?請參考內文。
增加自動編號的欄位
想要產生自動編號的編號 ,可以在產生表格的 Script 內,要設定的欄位後面新增 IDENTITY (1, 1) ,第一個數字表示起始數值,第二個數字表示遞增的數量:
CREATE TABLE [dbo].[SomeData](
[SN] BIGINT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (200) NULL,
CONSTRAINT [SomeData] PRIMARY KEY CLUSTERED ([SN] ASC)
);
新增資料時插入 IDENTITY 以外的欄位即可:
INSERT INTO SomeData ([Name]) VALUES('Apple');
INSERT INTO SomeData ([Name]) VALUES('Banana');
插入結果如下,可看見有自動編號:
| SN | Name |
|---|---|
| 1 | Apple |
| 2 | Banana |
參考資料:IDENTITY (屬性) (Transact-SQL) - SQL Server - Microsoft Learn
在 Identity 欄位新增特定的編號
如果想要插入自訂的編號,需要先設定特定資料表的 IDENTITY_INSERT 為 ON,然後再插入含 ID 欄位的資料。寫入完成後,應將 IDENTITY_INSERT 設為 OFF。
SET IDENTITY_INSERT SomeData ON ;
INSERT INTO SomeData (SN, [Name]) VALUES(0, 'Lazy');
SET IDENTITY_INSERT SomeData OFF;
NOTE: 將 IDENTITY_INSERT 設為 OFF 以後,會從原本的 Identity 繼續自動編號。如果需要設定新的起始編號,應使用 DBCC CHECKIDENT 方法,例如:
DBCC CHECKIDENT ('Users', RESEED, 200);
參考資料:[MSSQL]新增特定的識別欄位值(Identity) - 甚麼都略懂 就是不懂 - 點部落
新增資料後取得目前的編號
假如需要取得目前的編號 (例如要在其它資料表新增資料,且會參照到該編號,以利後續用 Join 連接),可以採用以下幾種方式:
| 語法 | 說明 |
|---|---|
@@IDENTITY |
取得目前連線、任意 Scope、任意資料表最後的 Identity (請小心使用) |
SCOPE_IDENTITY() |
取得目前連線、目前 Scope、任意資料表最後的 Identity (建議使用) |
IDENT_CURRENT('tableName') |
取得任何連線、任何 Scope 的特定資料表 Identity |
INSERT 語法搭配 OUTPUT 語法 |
最直覺的做法,但必須先輸出至變數或表格,才能再接著利用 |
Note: Scope 表示一個 SP、Trigger、function 或 batch。
參考資料:sql - How to get the identity of an inserted row? - Stack Overflow
為既有的資料表增加 Identity 欄位
語法如下:
ALTER TABLE xxx ADD NewId INT IDENTITY(1,1);
這個語法會為目前的所有資料列更新,以加上流水號,並產生 transaction log。
如果原本有很多資料的話,就會花費大量的時間更新,除了會導致 Table Lock,期間不能對資料表作 insert/update/delete 以外,也會產生大量的 transaction log。所以請小心使用。
