Sql Server中自动增量int主键的最大值

时间:2010-02-19 10:58:55

标签: sql-server

有最大值吗? SQL Server会在达到最大值时开始抛出SqlExceptions吗? 你是如何解决的? (归档?)

从SQL Server资源中我可以看到最大值为2,147,483,647。我离此很远,但我只是好奇。

5 个答案:

答案 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数据类型并且您已达到此数据类型的容量末尾,则必须执行以下操作:

  1. 删除旧数据。例如,从TABLENAME中删除pk<百万 当然,如果您的数据很重要,在删除之前,您必须将它们移动到存档表中。 这样,1到1000000的范围将变为免费,您可以使用它。 假设您的主键是动态插入的。这样你就得重新使用主键。
  2. 在您的桌子上运行此查询:

    DBCC CHECKIDENT(TableName,RESEED,0)

  3. 这样,您的记录将从1开始插入主键。

    但请注意,如果您的pk达到1000001,您将遇到错误,因为您的表中存在此主键。换句话说,你总是要考虑你的主键。