是否存在最大值? 当达到最大值时,SQL Server会抛出SqlExceptions吗? 如何解决?(归档?)
从SQL Server资源中可以看出,最大值为2,147,483,647。我还远没有达到这个值,但我只是好奇。
是否存在最大值? 当达到最大值时,SQL Server会抛出SqlExceptions吗? 如何解决?(归档?)
从SQL Server资源中可以看出,最大值为2,147,483,647。我还远没有达到这个值,但我只是好奇。
int
的最大值确实为2,147,483,647。
如果您尝试超过最大限制,您将会收到此错误:
Msg 8115, Level 16, State 1, Line 2
Arithmetic overflow error converting IDENTITY to data type int.
Arithmetic overflow occurred.
如果那个不够大,使用 bigint
(9,223,372,036,854,775,807)。您可以使用这个小例子来查看错误
use tempdb;
if OBJECT_ID('dbo.test', 'U') is not null drop table dbo.test
create table test
( id int identity not null,
dummy int not null )
go
SET IDENTITY_INSERT dbo.test ON
insert into test(id, dummy) values(2147483647, 1)
SET IDENTITY_INSERT dbo.test OFF
insert into test(dummy) values(1)
错误信息:
(1 row(s) affected)
Msg 8115, Level 16, State 1, Line 8
Arithmetic overflow error converting IDENTITY to data type int.
Arithmetic overflow occurred.
IDENTITY
修饰符定义。对于INT
列,您已经确定了最大值。如果需要具有更大范围的数据类型,则BIGINT
是明显的选择,并且它可以很好地标记为IDENTITY
。
TINYINT
:0到255SMALLINT
:-32768到32767INT
:-2147483648到2147483647BIGINT
:-9223372036854775808到9223372036854775807IDENTITY
实现仍将尝试在每次插入时递增计数器。DBCC CHECKIDENT(jobs,RESEED,0)
将重置计数器),但这不是SQL Server提供的开箱即用的功能。您必须自己实现此逻辑,并进一步考虑重用标识符可能给应用程序带来的麻烦。例如,对于Web应用程序,旧URL是否突然指向新文档或返回404错误?DBCC CHECKIDENT(TableName, RESEED,0)