Columnas IDENTITY (Parte 2)

En el artículo Columnas IDENTITY (Parte 1) estudiamos los conceptos básicos de una columna de identidad, como se configura y los aspectos que debemos tener en cuenta al momento de utilizar este tipo especial de columna. Esta es una continuación de dicho artículo, por lo que recomendamos leer primero la parte 1.

En este artículo vamos a ver como insertar un valor explicito en una columna de tipo Identity. Pero antes quería recalcar que en una tabla solo puede haber una campo definido como columna de identidad, solo uno. Comenzamos creando nuestra base de datos y tabla de prueba:

 

Insertamos un par de registros de prueba:

 

Forzamos un error para generar un salto en la secuencia de identidad

 

Al ejecutar esta sentencia, debe retornar el siguiente error:

Msg 515, Level 16, State 2, Line 2 Cannot insert the value NULL into column ‘FechaOperacion’, table ‘TestIdentity.dbo.RastreaOrdenes’; column does not allow nulls. INSERT fails.
The statement has been terminated.

 

Insertamos un registro de prueba adicional

 

Y esto es lo que tenemos hasta el momento:

image

Observamos que el numero 3 no se encuentra. Ya en el artículo anterior explicamos que esto pasa por que, cuando intenté ingresar el tercer registro no se especificó el valor de una columna que es obligatoria. SQL Server retorna error y no inserta el registro, pero si aumenta el numero de la secuencia.

Entonces, que pasa si yo deseo ingresar un registro con el valor de Id e 3? Acaso no vimos en el primer artículo que si especifico un valor para la columna de identidad, retorna error?

Hay una forma de hacerlo y es utilizando la propiedad IDENTITY_INSERT. Vamos a ver como:

Como vemos, ya hemos logrado insertar un registro completando la serie con el número que faltaba. Pero, como hemos configurado la propiedad IDENTITY_INSERT con el valor de OFF (apagada) estamos obligados a seguir indicando explicitamente el valor en el campo Id. Veamos:

 

Al ejecutar esta sentencia, obtenemos el siguiente mensaje de error:

Msg 545, Level 16, State 1, Line 1 Explicit value must be specified for identity column in table ‘RastreaOrdenes’ either when IDENTITY_INSERT is set to ON or when a replication user is inserting into a NOT FOR REPLICATION identity column.

 

Entonces, para que nuevamente el valor de la columna de identidad se autogenere de manera automática, se tiene que “prender” la propiedad IDENTITY_INSERT:

 

OTROS CONCEPTOS RELATIVOS A COLUMNAS IDENTITY

Hay algunas funciones de metadata que permiten obtener información de las columnas identity:

 

IDENT_SEED: Permite averiguar el numero inicial de la columna de identidad.

 

IDENT_INCR: Permite averiguar el incremento de la columna de identidad.

 

IDENT_CURRENT: Permite averiguar el numero actual de la columna de identidad.

 

SCOPE_IDENTITY: Permite averiguar el último numero generado por la columna de identidad. Esta función utilizada en la transacción de inserción de un registro permite averiguar el numero generado en tiempo de ejecución.

 

Si deseamos eliminar uno o varios registros, para no alterar la continuidad de la secuencia se puede reconfigurar el valor actual de la secuencia. Para ello utilizamos un Data Base Control Command (DBCC). Hay que prestar atención para que no se repita un valor, si el campo es llave primaria:


4 comentarios en “Columnas IDENTITY (Parte 2)

  • Hola, una pregunta: En qué casos conviene usar una columna identity y cuando no, es decir cuando optar por una identity o una clave natural. Gracias

    • Ricardo: En todos los casos es mejor usar una clave subrogada (artificial) con números enteros. Los números enteros son más rápidos de procesar, por lo que favorecen la velocidad en la lectura y la resolución de los JOIN.

      La columna Identity solo soportan tipos de datos enteros, y es práctica por que te libera de la necesidad de agregar código para controlar el correlativo.

      Saludos

      Alberto

Deja un comentario

Tu dirección de correo electrónico no será publicada.