SQL Server自增列(Identity列)的所有操作
目录
一、定义
- 在CREATE TABLE 中:
CREATE TABLE dbo.Identity_test
(
ID INT IDENTITY(1,1), --(seed = 1,increment = 1) 从1开始,每次递增1
Content NVARCHAR(200)
)
- 在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列不是主键,没有设唯一索引,它的值是可以重复的。
五、重置当前列表值
在必要的时候,可以用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会自动按新的种子和递增赋值。
查询数据库中所有含自增列的:表名,表中自增列列表,种子值,增量,当前ID值
七、查询数据库的所有自增列(Identity列)的情况
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