在 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;
參考資料:[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