SQL Server: Cómo anular temporalmente un campo auto-numérico
Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

SQL Server: Cómo anular temporalmente un campo auto-numérico

Toda tabla de una base de datos debería disponer de una clave primaria. Esta clave primaria identifica de manera única a cualquier registro dentro de dicha tabla. Incluso aunque creas que no necesitas un campo de este tipo, que actúe de clave primaria, al final lo acabarás echando de menos. Así que úsalo siempre.

Bien, el caso es que una forma muy habitual de crear una clave primaria es utilizando un campo numérico auto-incrementado, también llamado simplemente "auto-numérico". El típico campo "Id" que se traduce en nombres de campo de tipo idEntidad (idFactura, idProducto y similares) y que va aumentando de 1 en 1 cada vez que metemos algo en la tabla.

Este tipo de campos se definen como en la figura:

Campo auto-incremental en SQL Server

Como vemos el campo es una clave primaria (el icono con la llave amarilla recuadrado arriba), y se ha marcado como identidad que parte de 1 y se incrementa de 1 en 1, que es lo más normal (podría empezarse en otro número y aumentar de "x" en "x" también pero sería muy raro).

Al definirlo así, cada vez que insertemos un nuevo registro en la tabla no podemos especificar valor alguno para este campo (idProducto), sino que la base de datos se encarga de manera automática de asignarle el siguiente valor disponible, evitando problemas de concurrencia (si se insertan varios registros a la vez) y nos podemos despreocupar de esto.

Por ejemplo, en esta tabla tan sencilla hemos introducido 4 productos que han sido numerados automáticamente por la base de datos desde el 1 al 4:

Unos cuantos productos en tabla

Ojo: los números de la izquierda del todo son solamente el número de fila, no tienen nada que ver con los datos de la tabla.

Pero ¿qué pasa si en alguna ocasión necesitamos poder insertar valores concretos en un campo auto-numérico y evitar que los genere automáticamente?

Por ejemplo, hemos borrado sin querer algunos registros y queremos recuperarlos desde una copia de seguridad, y necesitamos insertarlos en la tabla de nuevo con el mismo identificador numérico que tenían antes.

Si los insertásemos de la manera convencional (con un INSERT) se añadirían, pero el identificador cambiaría, añadiéndose automáticamente el siguiente disponible, y dejando los huecos. Esto no nos sirve puesto que seguramente restauraríamos otras tablas también relacionadas con esta y la forma de relacionarlas es a través de estos identificadores...

Para poder anular temporalmente el auto-numérico SQL Server dispone de la instrucción SET IDENTITY_INSERT.

Su uso es directo y sencillo. Basta con escribir:

SET IDENTITY_INSERT NombreTabla ON

para desactivarlo, y

SET IDENTITY_INSERT NombreTabla OFF

para activarlo de nuevo, generalmente poniendo uno al principio y otro al final, con las instrucciones de inserción por el medio.

Nota: es importante señalar que el nombre y el valor ON u OFF especificado engañan un poco. Tal y como se ha nombrado esta función parece que al poner un ON estamos activando el auto-numérico, y con OFF desactivándolo, pero es justo al revés. Lo que quiere decir el nombre es que estamos activando la inserción manual de la identidad, de ahí que lleve ON para hacerlo. Ojo con esto.

Fíjate por ejemplo en el siguiente grupo de instrucciones aplicado sobre la tabla anterior, y su resultado final:

Insertando con y sin auto-numérico

Si te fijas lo primero que hemos hecho es desactivar los auto-numéricos de la tabla Productos. Al insertar un registro hemos tenido que especificar el identificador que le queremos dar, en este caso un 7, el cual se inserta sin problemas.

Al restaurar la funcionalidad de auto-incremento, si insertamos un nuevo registro (esta vez ya sin especificar el valor del campo idProducto), vemos que el siguiente auto-numérico es ya el 8, el siguiente al que acabamos de insertar, ya que es también el mayor.

Por supuesto si hubiese habido "huecos" en la numeración del campo podríamos haber insertado registros en ellos. Por ejemplo, ahora mismo tenemos un hueco en el 5 y el 6 por lo que podríamos desactivar de nuevo el auto-numérico e insertar dos registros para rellenarlos.

Una cuestión importante: solo es posible tener una tabla al mismo tiempo con este modo activado. Si intentamos usarlo con el modo ON en una tabla sin haberlo desactivado con OFF previamente en otra que estuviese puesta en este modo, se producirá un error.

En resumen

Esta funcionalidad es extremadamente útil a la hora de "arreglar" tablas por ejemplo, como digo, al restaurar información y cuestiones por el estilo. En general no la usaremos nunca desde una aplicación normal, ya que entonces de entrada es mejor que no pongamos el auto-numérico si no lo vamos a usar, claro.

Por supuesto hay que tener mucho cuidado con lo que hacemos. Mientras esté activado si otros usuarios introducen registros de manera convencional se produciría un error, ya que no estarían especificando el valor del campo identidad y fallaría la inserción. Por ello, si necesitamos realizar una operación de mantenimiento que haga uso de esta funcionalidad lo mejor sería que detuviésemos la aplicación unos instantes para evitar posibles interferencias de este tipo.

Conviene tener presente a este operador SET IDENTITY_INSERT. Puede salvarnos de más de un problema gordo con los datos 😎

¡Espero que te sea útil!

José Manuel Alarcón Director de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José Manuel Alarcón

No te pierdas ningún post

Únete gratis a nuestro canal en Telegram y te avisaremos en el momento en el que publiquemos uno nuevo.

Archivado en: Acceso a Datos

Agregar comentario