2010-02-19 23 views

Respuesta

6

se puede ver el error utilizando este pequeño ejemplo

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) 

el error:

(1 row(s) affected) 
Msg 8115, Level 16, State 1, Line 8 
Arithmetic overflow error converting IDENTITY to data type int. 
Arithmetic overflow occurred. 
9

El máximo para int es de hecho 2,147,483,647.

Si intenta ir más allá del tamaño máximo, recibirá este error:

Msg 8115, Level 16, State 1, Line 2 
Arithmetic overflow error converting IDENTITY to data type int. 
Arithmetic overflow occurred. 

Si eso no es lo suficientemente grande, utilice un bigint (9.223.372.036.854.775.807)

5

El máximo se define por la tipo de datos, no por el modificador IDENTITY. Para una columna INT, ya descubrió el máximo. Si necesita un tipo de datos con un rango mayor, BIGINT es la elección obvia, y puede marcarse como IDENTITY.

  • TINYINT: 0 a 255
  • SMALLINT: -32768 a través 32767
  • INT: -2147483648 a 2147483647
  • BIGINT: -9223372036854775808 través 9223372036854775807

yo esperaría un error aumentar al intentar insertar filas después de llegar al máximo, ya que la implementación IDENTITY aún intente incrementar con cada inserción.

Si bien sería posible archivar filas en otro almacén de datos y comenzar a reutilizar identificadores (DBCC CHECKIDENT (jobs, RESEED, 0) restablecerán el contador), no es algo que SQL Server ofrezca de fábrica. Tendrá que implementar la lógica para esto usted mismo, y además tendrá que considerar qué tipo de problema pueden traer los identificadores de reutilización a su aplicación. Para una aplicación web, por ejemplo, ¿las URL antiguas apuntan repentinamente a nuevos documentos o devuelven errores 404?

1

Tenga en cuenta que si usted truncar la tabla, está restableciendo esencialmente la ID. Puede ser útil en casos donde no puede colocar y recrear la tabla.

+0

Esta respuesta se mejoraría mediante un enlace a una fuente de documentación. –

1

Si usted insiste en el uso de tipo de datos INT ejemplo de su clave primaria y que haya llegado al final de la capacidad de este tipo de datos, lo que tiene que hacer lo siguiente:

  1. Borrar datos más antiguos. Por ejemplo, elimine de TABLENAME donde pk Por supuesto, si sus datos son importantes, antes de eliminarlos, debe moverlos a una tabla de archivos. De esta manera, el rango de 1 a 1000000 será gratuito y puede usarlo. Supongamos que su clave principal está insertada dinámicamente. De esa manera, debe RESISTIR su clave principal.
  2. Ejecutar esta consulta en la tabla:

    DBCC CHECKIDENT (NombreTabla, RESEED, 0)

De esa manera, su registro será insertado por clave principal de 1.

Pero considere que si su pk llega a 1000001, encontrará un error porque esta clave primaria existe en su tabla. En otras palabras, siempre debes considerar tu clave principal.

Cuestiones relacionadas