SQL Server自增列(Identity列)的所有操作
阿新 • • 發佈:2019-02-03
一、定義
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] -- 表中自增列的當前值
使用上面三個函式的一例:
DELETE 不會讓ID斷流,下次的ID值是ID列的增量+上次的ID值。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
Truncate 會讓ID列重新開始。
三、全域性變數@@Identity
@@Identity可以獲取最近產生的一個ID值,一般是Insert 之後產生的。不區分具體表。
在程式設計中可以用這個變數,而沒必要用select Max(ID) From TableName 這樣的語句,如果對其不放心,可以用ident_current()函式。
四、顯示插入ID列
這個需要先開啟 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列不是主鍵,沒有設唯一索引,它的值是可以重覆的。
五、重置當前ID值
在必要的時候,可以用DBCC CHECKIDENT命令來重置表中自增列的當前ID值。
如下示例將表的重置為10:
DBCC CHECKIDENT('dbo.Identity_test',RESEED,10) --下次從11開始
六、將Identity(1,1)改為Identity(10000,1)
這個沒有直接的辦法,只能繞道而行:ALTER TABLE dbo.Identity_test DROP COLUMN ID
GO
ALTER TABLE dbo.Identity_test ADD ID INT IDENTITY(10000,1)
Go
執行後,表中所有記錄的ID會自動按新的種子和遞增賦值。
七、查詢資料庫的所有自增列(Identity列)的情況
查詢資料庫中所有含自增列的:表名,表中自增列列表,種子值,增量,當前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