Pregunta Límite superior para la clave primaria autoincrement en SQL Server


¿Cuál es el límite superior para una clave primaria autoincrement en SQL Server? ¿Qué sucede cuando una clave primaria de autoincrement de SQL Server alcanza su límite superior?


32
2017-11-04 13:02


origen


Respuestas:


La respuesta de Joel es correcta, es el límite superior de cualquier tipo de datos que use.

Aquí hay un ejemplo de dos de ellos:

  • int: 2 ^ 31-1 (2,147,483,647)
  • letra grande: 2 ^ 63-1 (9,223,372,036,854,775,807)

De hecho, llegué al límite en un trabajo en el que trabajé. El error real es:

    Msg 8115, nivel 16, estado 1, línea 1
    Error de desbordamiento aritmético al convertir IDENTITY a tipo de datos int.
    Desbordamiento aritmético ocurrió.

Hay un par de soluciones a esto que puedo pensar en la parte superior de mi cabeza. El número 1 es probablemente muy difícil y no muy probable, el número 2 es fácil, pero probablemente cause problemas en su código base.

  1. Si la columna de identidad no le importa (no es una clave externa, etc.), puede volver a resembrar la base de datos y restablecer la columna de identidad.
  2. Cambie su columna de identidad a un número mayor. Entonces, por ejemplo, si ha desbordado un int, cambie su columna de identidad a un int grande. Buena suerte desbordante :)

Probablemente haya otras soluciones, pero no hay una solución mágica fácil. Solo espero que esto no ocurra en una mesa que sea el centro de un grupo de relaciones, porque si lo hace, tendrás mucho dolor. No es una solución difícil, solo una tediosa y larga.


35
2017-11-04 13:20



Depende del tipo de datos. Si usa bigint, es poco probable que se desborde. Incluso una int normal te da un par de miles de millones de filas. Nunca me he desbordado, así que no puedo decirte lo que sucederá si lo haces.


4
2017-11-04 13:04



Te diré lo que sucede ... mis datos dejaron de insertarse en esa tabla específica. La base de datos todavía funciona, pero encontré datos faltantes e incoherentes. Con un poco de investigación, encontré la tabla de errores, luego ejecuté una inserción manual. El error es el mismo que el anterior.

Tuve que cambiar la columna a BIGINT. En una base de datos de 26 GB en un servidor algo lento, tomó aproximadamente 30 minutos. En la versión de archivo de la base de datos (150 GB más o menos) tomó bastante más tiempo.

Afortunadamente, no hay demasiadas relaciones para esta mesa, por lo que el dolor fue muy leve.


2
2017-11-24 21:06



Descripciones de los tipos de datos:

BIGINT    Integer data from -2^63 through 2^63 - 1

INT       Integer data from -2^31 through 2^31 - 1

SMALLINT  Integer data from -2^15 through 2^15 - 1

TINYINT   Integer data from 0     through 255

Cuando alcanzas el límite superior, la autoincrementación va al límite inferior.


1
2017-11-04 13:11



DBCC CHECKIDENT (SomeTable, RESEED, 1)

Esto restablece la identidad a 1 en la tabla 'SomeTable'

No estoy seguro si esta es la mejor manera de hacer esto.


1
2017-12-21 21:02