Memorias de un DBA

Un blog dedicado a contribuir a la comunidad SQL Server en español

Funcionalidad de IDENTITY_INSERT

leave a comment »

Las tablas comúnmente tienen un campo codigo el cual es el que identifica al registro, este campo normalmente es la clave primaria de la tabla. Normalmente se usa una columna de tipo identity para poder implementar el campo codigo en una tabla debido a su facilidad de manejo, debido a que no se necesita hacerle mantenimientos y siempre genera un numero correlativo segun la secuencia que se le haya definido.

Pero hay ocaciones en las que se desea cargar información a tablas con campos de tipo identity, y entre los campos a cargar se tienen los codigos que son representados por el campo tipo identity. Para poder cargar informacion a este campo se debe de deshabilitar el identity, lo cual se realiza a través de una instrucción simple “identity_insert”. Seguidamente podremos ingresar los codigo que se desee, obviamente sin repetir el mismo codigo, finalmente volvemos a habilitar el campo identity y automaticamente la tabla reseteara el siguiente numero que generara el identity al maximo valor que actualmente se encuentra en la tabla. A continuación se presenta un ejemplo simple del funcionamiento de esto.

USE tempdb
GO
-- creamos la tabla de prueba
IF (OBJECT_ID('dbo.TestIdentity') IS NOT NULL)
DROP TABLE dbo.TestIdentity
GO
CREATE TABLE dbo.TestIdentity
(id INT IDENTITY(1,1)
,
VALUE CHAR(1));
GO
-- insertamos dos valores cualquiera
INSERT INTO dbo.TestIdentity
VALUES ('a'),('b')
GO
-- verificamos que el campo id fue generado secuencialmente
-- comportamiento propio de los campos identity
SELECT * FROM dbo.TestIdentity
GO
/*
id          value
----------- -----
1           a
2           b
*/
-- activamos la opcion para poder ingresar valores especificos
-- a un campo identity
SET IDENTITY_INSERT dbo.TestIdentity ON
GO
-- ingresamos un registro con el id en 1000
INSERT INTO dbo.TestIdentity (id,VALUE)
VALUES (1000,'c')
GO
-- desactivamos la opcion para ingresar valores especificos
-- a un campo identity
SET IDENTITY_INSERT dbo.TestIdentity OFF
GO
-- verificamos que el nuevo registro fue ingresado con el valor que idicamos
SELECT * FROM dbo.TestIdentity
GO
/*
id          value
----------- -----
1           a
2           b
1000        c
*/
-- ingresamos dos nuevos valores
INSERT INTO dbo.TestIdentity
VALUES ('d'),('e')
GO
-- verificamos que los codigos de los dos ultimos valores
-- inicia a partir del maximo codigo que contiene la tabla
SELECT * FROM dbo.TestIdentity
GO
/*
id          value
----------- -----
1           a
2           b
1000        c
1001        d
1002        e
*/
-- volvemos a activar la opcion para poder ingresar valores
-- especificos a un campo identity
SET IDENTITY_INSERT dbo.TestIdentity ON
GO
-- ingresamos un valor de menor valor al maximo
INSERT INTO dbo.TestIdentity (id,VALUE)
VALUES (900,'f')
GO
-- desactivamos la opcion para ingresar valores especificos
-- a un campo identity
SET IDENTITY_INSERT dbo.TestIdentity OFF
GO
-- comprobamos que el valor fue ingresado
SELECT * FROM dbo.TestIdentity
GO
/*
id          value
----------- -----
1           a
2           b
1000        c
1001        d
1002        e
1003        d
1004        e
900         f
*/
-- volvemos a ingresar dos nuevos registros
INSERT INTO dbo.TestIdentity
VALUES ('g'),('h')
GO
-- Verificamos que el siguiente codigo generado sigue siendo
-- a partir del maximo de la tabla
SELECT * FROM dbo.TestIdentity
GO
/*
id          value
----------- -----
1           a
2           b
1000        c
1001        d
1002        e
1003        d
1004        e
900         f
1005        g
1006        h
*/

Como se puede observar, así se inserte un numero menor al que se tiene ya ingresado en la tabla el campo identity, no colisionara con otros código debido a que siempre esta actualizado con el máximo código que tiene la tabla. Bueno espero que les haya servido esta corta explicación.

Written by dbamemories

agosto 2, 2011 a 4:52 pm

Publicado en T-SQL

Tagged with , , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: