viernes, 10 de agosto de 2012

Resetear una Columna Identidad (Identity) de SQL Server 2008

En muchos de los Proyectos que he realizado siempre nos hemos encontrado con el Escenario en que para algunas tablas las Claves primarias son Enteras y con la caracteristica de ser una Identity pero el problema surgia en que al eliminar todos los registros de la tabla la columna Identidad guardaba el ultimo valor entero generado y se perdia la secuencia de la misma.

Para los Beginners una columna Identity (Identidad) tiene la caracteristica de tomar valores autogenerados.

Por ejemplo.

Creo esta tabla Alumnos en mi BD SQL Server.

CREATE TABLE Alumnos
(
codigo INT PRIMARY KEY IDENTITY(1,1),
nombre VARCHAR(30)
)

Como veran el campo codigo es una columna Identidad (Identity) que iniciara con valor 1 y se ira incrementando por cada Insert sobre esta tabla en 1.

Los valores dentro de los parentesis pueden ser modificables como por ejemplo quiero que comienze en 100 y se vaya incrementando en 50 entonces quedaria de la siguiente manera

CREATE TABLE Alumnos
(
codigo INT PRIMARY KEY IDENTITY(100,50),
nombre VARCHAR(30)
)

una vez creada la tabla ingresamos 4 registros y consultamos la tabla.

INSERT INTO ALUMNOS (nombre)VALUES('Cristina')
INSERT INTO ALUMNOS (nombre)VALUES('Nicole')
INSERT INTO ALUMNOS (nombre)VALUES('Jhon')
INSERT INTO ALUMNOS (nombre)VALUES('Angel')




como observaran una columna identidad ya no participa de la sentencia insert ya que es un codigo Autogenerado, y como apreciaran el codigo inicia con el valor de 100 y se va incrementando de 50 en 50.

ahora haremos el siguiente escenario. que pasaria si elimino todos los registros de la tabla y inserto un nuevo registro.

DELETE ALUMNOS
go

INSERT INTO ALUMNOS (nombre)VALUES('Royser')

ahora consultamos la tabla nuevamente, y veamos algunas observaciones.



Observamos que una vez despues de eliminar todos los registros de la tabla Alumnos se perdie la secuencia y mas aun de iniciar en 100 como esta en la definicion cuando creamos la tabla.

Bueno para solucionar este problema tenemos que hacer el uso del siguiente comando.

DBCC CHECKIDENT (NOMBRE_TABLA, RESEED, VALOR_IDENTIDAD)
GO

hago un parentisis "(" y quiero entrar a detallar un poco la utilidad de este comando DBCC CHECKIDENT

CHECKIDENT comprueba la identidad actual de la tabla especificada y parte de su funcionalidad es cambiar el valor de la identidad, en pocas palabras modificar manualmente el valor de Identidad Actual de la columna.

la sintaxis es la siguiente:

DBCC CHECKIDENT 
( 
        NOMBRE_TABLA
        [ , { NORESEED | { RESEED [ , NUEVO_VALOR_IDENTIDAD ] } } ]
)

[ WITH NO_INFOMSGS ]


NOMBRE_TABLA: Es el nombre de la tabla del cual se va a ser la verificacion del valor de la columna Identidad.

Esta tabla debe contener una columna Identidad sino esta demas de hacer la comprobacion.

por ejemplo ejecuto lo siguiente:

DBCC CHECKIDENT(ALUMNOS)

Resultado
----------

Checking identity information: current identity value '250', current column value '250'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Como observaran la ionformacion de la verificacion muestra que el valor actual de la identidad es de 250 y el actual valor de la columna es 250. por lo tanto no se ha hecho algun cambio manual para que varie el valor de la columna actual.

hagamos lo siguiente: ejecutar el comando y modificar manualmente el valor de la identidad para que inicie 500 (si deseo que el siguiente registro comienze en 500 deberia iniciarlo en 450)

DBCC CHECKIDENT (ALUMNOS, RESEED, 450)
GO

Tenemos el siguiente mensaje:

Checking identity information: current identity value '250', current column value '450'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Ahora si notamos la diferencia, el actual valor de la columna Identidad es 250 pero si hago un nuevo INSERT tomara el valor actual de la columna identidad que es 450 + 50 el incremento = 500 = Codigo Identidad.

Comprobemos

INSERT INTO ALUMNOS (nombre)VALUES('Royser')

codigo      nombre
----------- ------------------------------
100         Cristina
150         Nicole
200         Jhon
250         Angel
500         Royser

(5 row(s) affected)
NORESEED: Indica que el valor de la identidad en este caso la columna no debe cambiar.

RESEED: Indica que el valor de la identidad en este caso la columna no si debe cambiar.

NUEVO_VALOR_IDENTIDAD: Es el nuevo valor de identidad actual.
WITH NO_INFOMSGS
 : Suprime los mensajes de informacion.

Ahora volviendo al ejercicio propuesto se debera ejecutar lo siguiente:

DBCC CHECKIDENT(ALUMNOS, reseed, 50)

ahora se preguntaran porque iniciamos en 50 y porque no en 100. Es muy simple porque si iniciamos en 100 el primer insert que se haga en la tabla hara que se incremente en 50 osea por consecuencia el primer registro tendra el codigo 100 + 50 = 150.

Es por eso que inicio con 50 para que el primer registro tenga el codigo iniciado en 50 + 50 del incremento = 100 y asi siga la secuencia inicialmente.

Antes de ejecutar el comando DBCC CHECKIDENT Eliminamos nuevamernte todos los registros y luego ejecutamos el comando DBBC CHECKIDENT y luego hacemos un nuevo Insert de los valores Iniciales

DELETE ALUMNOS
GO

DBCC CHECKIDENT (ALUMNOS, RESEED, 50)
GO

INSERT INTO ALUMNOS (nombre)VALUES('Cristina')
INSERT INTO ALUMNOS (nombre)VALUES('Nicole')
INSERT INTO ALUMNOS (nombre)VALUES('Jhon')
INSERT INTO ALUMNOS (nombre)VALUES('Angel')

hacemos un nuevo select a la tabla de alumnos y veamos el siguiente resultado.

No hay comentarios:

Publicar un comentario