Identidad: Cambiar valores de campo Identity
La propiedad identity
La propiedad identity nos permite crear una columna de identidad en una tabla, es decir, una columna en la que estamos seguros de que cada fila tiene un valor único. Y ese es el propósito de un campo identity, asegurarnos que nuestras filas tengan algo que las distinga unas de otras.
La propiedad identity se establece en una sentencia de CREATE TABLE o de ALTER TABLE de la siguiente manera:
IDENTITY [ ( semilla , incremento ) ]
Donde la semilla es el entero a partir del cual empezará a contar nuestro campo identity, y el incremento es el valor que se agrega al valor de identidad de la fila anterior. Si no ponemos nada se asume que los dos valores son 1.
Cuando empezamos a usar este campo (supongamos que empieza en uno e incrementa de uno en uno) vemos que toma valores consecutivos al ir agregando filas. El valor de identity de la primera fila es 1, el de la segunda es 2, el de la tercera es 3 y así sucesivamente.
Pero en el momento que borramos una fila, por ejemplo la 10 y creamos una nueva ese valor que hemos borrado no se recupera.
Este comportamiento es lo normal en los campos identity, y además es lo que deseamos que ocurra porque siempre tenemos que tener claro que este tipo de campos se utilizan para asegurarse que hay alguna manera única de identificar una fila.
Por qué identity es como es
Veamos un ejemplo donde la reutilización de los valores identity sería un desastre.
Supongamos un par de tablas categorías y productos relacionadas entres sí:
Categorías
| IdCategoría |
NombreCategoría |
| 1 |
Pescados |
| 2 |
Refrescos |
| 3 |
Lácteos |
Productos
| IdProducto |
NombreProducto |
IdCategoría |
| 1 |
Queso Burgos |
3 |
| 2 |
Bacalao |
1 |
| 3 |
Leche |
3 |
| 4 |
Sardina |
1 |
| 5 |
Coca-Cola |
2 |
| 6 |
Merluza |
3 |
En las dos tablas hemos utilizado un campo identity para los Ids y como vemos se van llenando de manera incremental (recordemos que esos campos no se pueden modificar, al ser identity toman el valor que les corresponde al crearse la fila y son ‘inmodificables’)
Supongamos ahora que borramos la categoría de lácteos y creamos una nueva categoría llamada verduras. Al hacerlo la tabla categorías quedará de la siguiente manera
| IdCategoría |
NombreCategoría |
| 1 |
Pescados |
| 2 |
Refrescos |
| 4 |
Verduras |
Y ahora podemos utilizar ese nuevo Id de las verduras (el 4) para relacionar las verduras de la tabla productos con la tabla categorías.
Pero ¿que ocurriría si el campo identity funcionara de tal manera que al desaparecer un valor ya utilizado, el siguiente registro recuperase ese valor? Pues el desastre del que hablábamos antes. La nueva fila haría que la tabla categorías tuviese el IdCategoría=3 para las verduras con lo que el queso y la leche de la tabla productos pasarían a ser verduras.
Espero que este miniejemplo sirva para una de las razones por las que los campos identity funcionan como funcionan.
Conclusión sobre identity
Y qué conclusión sacamos de todo esto.
Pues que cuando utilizamos un identity siempre tenemos que tener claro que es un campo artificial, que su significado es dar un valor único en esa tabla para cada fila, y que nunca debemos dar significado real a nuestros identity.
Hay que olvidarse de que un identity sea un número de socio, un valor de un ticket, un número de factura…
Pero se puede cambiar o no
Pues sí.
Visto para que son los campos identity ahora pasamos a ver como podemos hacer para cambiar esos valores.
Hay veces que necesitamos por algún motivo recuperar un identity perdido y para ello utilizaremos la función SET IDENTITY_INSERT
SET IDENTITY_INSERT { tabla } { ON | OFF }
Aplicando esta sentencia sobre una tabla hacemos que nuestra tabla nos permita insertar valores de identidad ‘a mano’.
En cada momento sólo una tabla de la base de datos puede tener esta propiedad en ON.
Veamos un ejemplo en el que podemos utilizar esta función para recuperar un valor identity.
Vamos a trabajar con el Analizador de consultas por comodidad, así que podéis abrirlo y copiar lo siguiente:
-- Creamos la tabla socios
CREATE TABLE Socios (id int IDENTITY PRIMARY KEY, Nombre varchar(40))
GO
-- Insertamos unos cuantos socios
INSERT INTO Socios (Nombre) VALUES (‘Juan’)
INSERT INTO Socios (Nombre) VALUES (‘Ana’)
INSERT INTO Socios (Nombre) VALUES (‘Pedro’)
INSERT INTO Socios (Nombre) VALUES (‘Maria’)
GO
El contenido de esta tabla es:
Id Nombre
------------- ------------------
1 Juan
2 Ana
3 Pedro
4 Maria
Durante el trabajo diario con la base de datos ocurre que Pedro desaparece y se da de alta Jose. Y aunque nuestro campo es identity lo que queremos es que ese Jose tenga como id el que Pedro deja libre.
Ejecutamos el siguiente código para lograrlo:
-- Habilitamos la posibilidad de inserter en campos identity
SET IDENTITY_INSERT Socios ON
GO
-- Metemos el nuevo campo con id 3
INSERT INTO Socios (id, Nombre) VALUES(3, 'Jose').
GO
SET IDENTITY_INSERT Socios OFF
GO
Y ya tenemos el valor perdido recuperado para nuestro nuevo socio.
Hay algún método más para modificar el contenido de valores identity, pero para casos en los que estamos hacienda pruebas y necesitamos modificar algún valor esto puede servir.
Y nunca olvidemos que a las claves artificiales con valores identity no debemos darles significado porque en si mismas no lo tienen.