类型SQL Server中自增类型的应用技巧

什么是自增类型?

自增类型,顾名思义,就是在每次插入数据时自动增加一定的数值作为主键的类型。在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(序列)。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

数据库标签