有最大值吗? SQL Server会在达到最大值时开始抛出SqlExceptions吗? 你是如何解决的? (归档?)
从SQL Server资源中我可以看到最大值为2,147,483,647。我离此很远,但我只是好奇。
答案 0 :(得分:9)
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)
答案 1 :(得分:6)
你可以使用这个小例子看到错误
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.
答案 2 :(得分:5)
最大值由数据类型定义,而不是由IDENTITY
修饰符定义。对于INT
列,您已经计算出最大值。如果您需要范围更大的数据类型,BIGINT
是明显的选择,并且可以很好地标记为IDENTITY
。
TINYINT
:0到255 SMALLINT
: - 32768到32767 INT
: - 2147483648至2147483647 BIGINT
: - 9223372036854775808至9223372036854775807 我希望在达到最大值后尝试插入行时会出现错误,因为IDENTITY
实现仍会尝试使用每个插入进行递增。
虽然可以将行存档到其他数据存储并开始重用标识符(DBCC CHECKIDENT (jobs, RESEED, 0)
将重置计数器),但它不是SQL Server提供的开箱即用的功能。您必须自己实现此逻辑,并且您还必须考虑重用标识符可能给您的应用程序带来哪些麻烦。例如,对于Web应用程序,旧URL会突然指向新文档还是返回404错误?
答案 3 :(得分:1)
请注意,如果截断表格,则实质上是重置ID。在您无法删除并重新创建表格的情况下可能很有用。
答案 4 :(得分:1)
如果您坚持使用例如主数据的INT数据类型并且您已达到此数据类型的容量末尾,则必须执行以下操作:
在您的桌子上运行此查询:
DBCC CHECKIDENT(TableName,RESEED,0)
这样,您的记录将从1开始插入主键。
但请注意,如果您的pk达到1000001,您将遇到错误,因为您的表中存在此主键。换句话说,你总是要考虑你的主键。