Restablecer valor de IDENTIDAD

16

Tengo una tabla con una columna IDENTIDAD. Mientras desarrollo, elimino las filas de vez en cuando y las agrego nuevamente. Pero los valores de IDENTIDAD siempre siguieron aumentando y no comenzaron desde 1 cuando los agregué nuevamente. Ahora mi identificación va de 68 -> 92 y esto bloquea mi código.

¿Cómo restablezco el valor IDENTITY?

Gijs
fuente
Haría que mi código sea más resistente a los valores de identidad perdidos. Una columna de identidad no garantiza numeración contigua, y será finalmente sucederá
Trubs

Respuestas:

29

Puede restablecer el valor de identidad mediante

DBCC CHECKIDENT('tableName', RESEED, 0)

Entonces, la próxima vez que inserte en TableName, el valor de identidad insertado será 1.

Cuando elimina filas de la tabla, no restablecerá el valor de Identidad, pero seguirá incrementándolo. Justo como sucedió en tu caso.

Ahora, cuando trunca la tabla, restablecerá el valor de Identidad a su valor de Semilla original de la tabla.

Consulte: SERVIDOR SQL: BORRAR, TRUNCAR y RESEDIR identidad para obtener un ejemplo detallado y una buena explicación de la diferencia entre Truncar y Eliminar

Kin Shah
fuente
22

Kin le ha mostrado cómo puede restablecer el valor de IDENTIDAD, pero fuera de un entorno de desarrollo cuando realmente está eliminando todos los datos, ¿por qué necesita hacer esto?

Espero que no tenga la intención de mantener una secuencia contigua de valores de IDENTIDAD cuando esté en producción. Y espero que realmente no esté escribiendo su código para codificar los valores de IDENTIDAD. Si estos son valores de ID significativos, entonces debe dejar de usar la propiedad IDENTITY.

Hay algunas cosas que evitarán que esto suceda:

  • si se asigna un valor de IDENTIDAD durante una transacción, y la transacción se revierte, el valor no se "devuelve" y el siguiente valor será el que nunca se usó + 1.
  • Si una fila se elimina más tarde, la IDENTIDAD nunca regresa para llenar los vacíos.
  • hay un error activo en SQL Server 2012 que no se solucionará hasta que SQL Server 2014 nunca se repare (a menos que use un indicador de seguimiento indocumentado y muy costoso) por el cual un reinicio parecerá descartar hasta 1000 valores de su columna IDENTITY . El error en Connect sugiere que esto está restringido a eventos de conmutación por error que involucran grupos de disponibilidad, pero puedo asegurarle que el error es mucho más amplio que eso.

En resumen, si le importan las lagunas o desea dar un significado específico a estos valores, deje de usar IDENTITY. Descarte y vuelva a crear la tabla y, cuando necesite eliminar los valores y volver a llenarlos, realice una actualización o realice una inserción con valores codificados para esa columna.

Por otro lado, la clave primaria y la identidad no son lo mismo. Una columna de identidad no es una clave principal a menos que la defina explícitamente como tal, y ciertamente puede tener una clave primaria que no sea una columna de identidad.

Aaron Bertrand
fuente
-4

Si solo necesita eliminar las últimas filas que no han seguido el valor incremental de un campo de identidad, hay una manera fácil y segura:

  1. primero elimine los últimos registros que han 'saltado'
  2. cambiar el tipo de datos de su campo de identidad (de int a bigint o viceversa)
  3. salva la mesa
  4. agregue un nuevo registro y verifique que asigna el número del valor más alto + 1
  5. Reemplace el tipo de datos de su campo de identidad, según sea conveniente para sus necesidades

y listo

Ramon Baiges Miro
fuente
3
"Guardar la tabla" no es una declaración significativa para SQL Server. Cambiar los tipos de datos puede ser trivial con menos de 100 filas, pero podría resultar muy costoso para tablas grandes.
Michael Green
2
Supongo que te refieres a SSMS. Esto creará una nueva tabla, copiará todas las filas en ella, soltará la tabla anterior y cambiará el nombre de la nueva. Y debe hacer esto dos veces para alternar el tipo de datos. Está usando un mazo para romper una nuez.
Martin Smith