SqlServer中自增int主键的最大值是多少?

9

是否存在最大值? 当达到最大值时,SQL Server会抛出SqlExceptions吗? 如何解决?(归档?)

从SQL Server资源中可以看出,最大值为2,147,483,647。我还远没有达到这个值,但我只是好奇。

5个回答

12

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)。

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.

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错误?

1
请注意,如果您截断表格,实际上是重置ID。在无法删除并重新创建表格的情况下可能会有用。

这个答案如果附带一个文档来源链接会更好。 - Patrick M

1
如果您坚持使用INT数据类型作为主键,并且已经达到了该数据类型的容量上限,您需要执行以下操作:
  1. 删除旧数据。例如,从TABLENAME中删除pk < 1000000的数据。当然,如果您的数据很重要,在删除之前,您必须将其移动到归档表中。这样,1到1000000的范围将变为空闲状态,您可以使用它。假设您的主键是动态插入的。那么您必须重新设置主键。
  2. 在您的表上运行此查询:

    DBCC CHECKIDENT(TableName, RESEED,0)

这样,您的记录将按照主键从1开始插入。
但请注意,如果您的pk达到1000001,您将遇到错误,因为该主键在您的表中已存在。换句话说,您始终需要考虑您的主键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接