代码之家  ›  专栏  ›  技术社区  ›  Maxime Rouiller

当自动编号列的数字用完时,SQL 2005中会发生什么?

  •  10
  • Maxime Rouiller  · 技术社区  · 16 年前

    当SQL Server 2005达到标识列的最大值时会发生什么?它是从一开始就开始填补空白吗?

    SQL Server 2005发生时的行为是什么?

    6 回复  |  直到 11 年前
        1
  •  13
  •   xsl Fredrik Hedblad    16 年前

    达到最大值时会出现溢出错误。 . 如果使用的bigint数据类型的最大值为 9,223,372,036,854,775,807 这种情况很可能永远不会发生。

    您将收到的错误消息如下:

    Msg 220, Level 16, State 2, Line 10
    Arithmetic overflow error for data type tinyint, value = 256.
    

    (Source)

    据我所知,MS SQL不提供填补标识空白的功能,因此您要么自己完成此操作,要么更改标识列的数据类型。

    除此之外,还可以将起始值设置为最小的负数,以获得更大范围的值。

    Here is a good blog post about this topic .

        2
  •  1
  •   tvanfosson    16 年前

    它不会填补空白。相反,插入将失败,除非您更改列的定义,以便删除标识并找到其他填充间隙的方法,或者增大大小(从int变为bigint),或者更改数据类型(从int变为decimal),以便提供更多标识值。

        3
  •  1
  •   Kevin    16 年前

    在解决问题之前,您将无法插入新行,并将收到上面列出的错误消息。你可以通过多种方式做到这一点。如果仍然有数据,并且使用的ID都低于最大值,则必须更改数据类型。如果定期清除数据,并且您有一个很大的空白将无法使用,则可以将标识号重新设置为该空白中的最小数字。例如,在上一个作业中,我们正在记录事务。我们每个月大概有4000-5000万,但是我们清除了所有超过6个月的东西,所以每隔几年,身份就会接近20亿,但是我们没有低于15亿的身份证,所以我们会重新回到0。同样,这两种方法都不适用于您,您必须找到不同的解决方案。

        4
  •  0
  •   BradC    16 年前

    如果标识列是整数,则最大值为2147483647。如果超过这个值,就会出现溢出错误。

    如果您认为这是一个风险,只需使用bigint数据类型,它就可以提供9223372036854775807。无法想象有这么多行的数据库表。

    进一步讨论 here . (与上面提到的XSL链接相同)。

        5
  •  0
  •   Logicalmind    16 年前

    如果确实达到了标识列的最大数目,则可以将该表中的数据移动到具有较大标识列类型的辅助表中,并将新标识值的起始值指定为前一类型的最大值。新的标识值将从此处继续。

        6
  •  0
  •   Manuel Alves    15 年前

    如果您经常删除“旧值”,只需使用重置种子 DBCC CHECKIDENT('MyTable',重设,0);