什么是自增类型?
自增类型,顾名思义,就是在每次插入数据时自动增加一定的数值作为主键的类型。在SQL Server中,常见的自增类型是IDENTITY。
IDENTITY可以定义在整数类型上,如INT、BIGINT,而且每个表只能有一个IDENTITY列。在插入数据时,如果没有明确给出IDENTITY列的值,SQL Server会自动计算下一个可用的数值并自动插入。
CREATE TABLE TestIdentity
(
ID INT IDENTITY(1,1) PRIMARY KEY,
Name VARCHAR(50)
)
GO
-- 插入数据
INSERT INTO TestIdentity(Name) VALUES('Adam')
INSERT INTO TestIdentity(Name) VALUES('Bob')
INSERT INTO TestIdentity(Name) VALUES('Charlie')
-- 查询数据
SELECT * FROM TestIdentity
执行以上代码,可以得到如下结果:
ID Name
-- ------
1 Adam
2 Bob
3 Charlie
使用IDENTITY的注意事项
1. 插入数据时不能为IDENTITY列指定值
IDENTITY列的值是由SQL Server自动计算出来的,因此在插入数据时不能为其指定值。
如果有需要在插入数据时指定ID的需求,可以先关闭IDENTITY,插入指定ID的数据,再开启IDENTITY:
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity(ID, Name) VALUES(4, 'David')
SET IDENTITY_INSERT TestIdentity OFF
执行以上代码,可以得到如下结果:
ID Name
-- ------
1 Adam
2 Bob
3 Charlie
4 David
2. 删除IDENTITY列的值不会重置自增数值
在删除IDENTITY列的值时,SQL Server不会重置自增计数器,下次插入数据时仍然从之前的最大值加1开始计数。
如果需要重置计数器,可以使用DBCC CHECKIDENT命令,如:
-- 删除所有数据
DELETE FROM TestIdentity
-- 重置计数器
DBCC CHECKIDENT(TestIdentity, RESEED, 0)
-- 插入数据
INSERT INTO TestIdentity(Name) VALUES('Emily')
-- 查询数据
SELECT * FROM TestIdentity
执行以上代码,可以得到如下结果:
ID Name
-- ------
1 Emily
3. 复制表时IDENTITY列的计数器不会复制
在复制表时,IDENTITY列的计数器不会复制,新表中的IDENTITY列的计数器将从1开始,而不是从复制表中的最大值加1开始。
如果需要将计数器也复制过去,可以使用以下代码:
-- 复制表结构,但不包括数据
SELECT *
INTO TestIdentityCopy
FROM TestIdentity
WHERE 1=0
-- 插入数据
SET IDENTITY_INSERT TestIdentityCopy ON
INSERT INTO TestIdentityCopy(ID, Name)
SELECT ID, Name FROM TestIdentity
SET IDENTITY_INSERT TestIdentityCopy OFF
执行以上代码,可以得到如下结果:
ID Name
-- ------
1 Adam
2 Bob
3 Charlie
1 Adam
2 Bob
3 Charlie
4. IDENTIY的取值范围
IDENTITY的取值范围取决于定义的整数类型,如INT的取值范围为-2,147,483,648 ~ 2,147,483,647。
当IDENTITY的计数器达到最大值后,再插入数据时会抛出错误,此时可以使用DBCC CHECKIDENT命令重置计数器。
如果需要支持更大的主键取值范围,可以使用SEQUENCE(序列)。
总结
IDENTITY是SQL Server中常用的自增类型,可以在插入数据时自动计算主键,使用方便。
需要注意的是,在插入数据和删除数据时需要特殊处理,复制表时IDENTITY的计数器不会复制。
如果需要支持更大的主键取值范围,可以使用SEQUENCE(序列)。