1. 程式人生 > >SQL Server自增列(Identity列)的所有操作

SQL Server自增列(Identity列)的所有操作

一、定義

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

@@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