a)在CREATE TABLE 中:
CREATE TABLE dbo.Identity_test
(
ID INT IDENTITY(1,1), --(seed = 1,increment = 1) 從1開始,每次遞增1
Content NVARCHAR(200)
)
b)在SELECT INTO 中:
SELECT
IDENTITY(INT,100,1) ID,
ColName
INTO #temp FROM TableName
一個表最多只能有一個自增列。
下面的三個函數,可以很方便地查看表中identity列的情況
SELECT
IDENT_SEED('dbo.Identity_test') [IDENT_SEED] -- 表中自增列的種子值
,IDENT_INCR('dbo.Identity_test') [IDENT_INCR] -- 表中自增列的的增量
,IDENT_CURRENT('dbo.Identity_test') [IDENT_CURRENT] -- 表中自增列的當前值
表中的自增列一旦創建就不能更改種子值和增量值了,只能更改當前值。要修改只有先刪除再重建了
使用上面三個函數的一例:
INSERT INTO Identity_test(Content) -- 不寫出ID列,它自動增加
SELECT 'Str1' UNION ALL
SELECT 'Str2' UNION ALL
SELECT 'Str3' UNION ALL
SELECT 'Str4' UNION ALL
SELECT 'Str5'
SELECT
IDENT_SEED('dbo.Identity_test') [IDENT_SEED] -- 1
,IDENT_INCR('dbo.Identity_test') [IDENT_INCR] -- 1
,IDENT_CURRENT('dbo.Identity_test') [IDENT_CURRENT] -- 5
DELETE 不會讓ID斷流,下次的ID值是ID列的增量+上次的ID值。
Truncate 會讓ID列重新開始。
@@Identity可以獲取最近產生的一個ID值,一般是Insert 之後產生的。不區分具體表。
在編程中可以用這個變量,而沒必要用select Max(ID) From TableName 這樣的語句,如果對其不放心,可以用ident_current()函數。
這個需要先開啟 SET IDENTITY_INSERT TableName ON,而且不能省略Insert後面括號裏的列名列表。
例如:
SET IDENTITY_INSERT dbo.Identity_test ON
INSERT INTO Identity_test(ID,Content) -- 顯示寫出列表,至少ID列表不能少
SELECT 11,'Repeat'
SET IDENTITY_INSERT dbo.Identity_test OFF
注意,只要ID列不是主鍵,沒有設唯一索引,它的值是可以重覆的。
在必要的時候,可以用DBCC CHECKIDENT命令來重置表中自增列的當前ID值。
如下示例將表的重置為10:
DBCC CHECKIDENT('dbo.Identity_test',RESEED,10) --下次從11開始
ALTER TABLE dbo.Identity_test DROP COLUMN ID
GO
ALTER TABLE dbo.Identity_test ADD ID INT IDENTITY(10000,1)
Go
執行後,表中所有記錄的ID會自動按新的種子和遞增賦值。
查詢數據庫中所有含自增列的:表名,表中自增列列表,種子值,增量,當前ID值
SELECT
b.name TableName
,a.name ColumnName
,a.seed_value
,a.increment_value
,a.last_value
FROM sys.identity_columns a
INNER JOIN sys.tables b ON a.object_id = b.object_id