Es posible que alguna ocasión os hayáis encontrado con una tabla en la que tenéis una
columna identity
[AddressID] (normalmente primary key) y queréis rellenar los
valores
libres en la
columna
(debido a eliminaciones) o queráis importar un conjunto de datos que queréis que tengan determinados
valores
en esa columna; en este ejemplo es explicaré cómo hacerlo, es muy sencillo.
- Lo primero, supongamos que creamos la siguiente tabla donde la
columna identity
se inicializa con el valor
2 y se incrementa en 1 en cada inserción.
-- Creación de la tabla con la columna [AddressID] identity
CREATE TABLE [Address](
[AddressID] [int] IDENTITY(2,1) NOT NULL,
[Address] [varchar](100) NOT NULL,
[City] [varchar](30) NOT NULL,
[PostalCode] [varchar](15) NOT NULL,
CONSTRAINT [PK_Address_AddressID] PRIMARY KEY CLUSTERED ([AddressID] ASC)
- Una inserción cualquiera en la tabla sería:
-- Inserción de un fila sin asignar valor a columna identity
INSERT INTO [Address]
([Address]
,[City]
,[PostalCode])
VALUES
('Paseo de Gracia 25'
,'Barcelona'
,'08007')
Si hacemos un SELECT sobre la tabla nos devolverá 1 registro y veremos que el valor
de la columna
[AddressID] es 2. Una observación importante, si queremos saber el valor
que se asigna a la columna identity
(por ejemplo, porque ese valor
será foreign key en otra columna
de otra tabla) la forma correcta de hacerlo sería:
-- Iniciamos transacción
BEGIN TRANSACTION
-- Inserción de un fila sin asignar valor a columna identity
INSERT INTO [Address]
([Address]
,[City]
,[PostalCode])
VALUES
('Paseo de Gracia 25'
,'Barcelona'
,'08007')
-- Obtenemos valor asignado a la columna identity
SELECT IDENT_CURRENT('[Address]')
-- ... otras instrucciones
-- Confirmamos transacción
COMMIT TRANSACTION
Si queréis más información sobre la instrucción IDENT_CURRENT de Transact-SQL podéis encontrarla en este enlace del MSDN.
- Bien, ahora supongamos que queremos insertar una fila con
valor
1 en la columna identity
([AddressID]) de la tabla, la instrucción a ejecutar sería la siguiente.
-- Activar inserción de valores explícitos en columna identity
SET IDENTITY_INSERT [Address] ON;
-- Inserción de un fila asignando valor a columna identity
INSERT INTO [Address]
([AddressID],
,[Address]
,[City]
,[PostalCode])
VALUES
(1
,'Paseo de Gracia 23'
,'Barcelona'
,'08007')
-- Desactivar inserción de valores explícitos en columna identity
SET IDENTITY_INSERT [Address] OFF;
Lo que hacemos en este caso es primero activar la inserción de valores
explícitos en la columna identity
, posteriormente hacemos el INSERT incluyendo el nombre de la columna
y el valor
correspondientes a la columna identity
y por último desactivamos la inserción de valores
explícitos. Igual que en el caso anterior podemos utilizar la instrucción IDENT_CURRENT de Transact-SQL... ¿qué valor
nos devolverá? Pues seguirá devolviendo 2 y no 1 ya que siempre devuelve el último valor de identidad
generado para una tabla o vista especificadas (el 1 no es generado sino asignado explícitamente a la columna
de la tabla).
Si queréis más información sobre la instrucción SET IDENTITY_INSERT de Transact-SQL podéis obtenerla en el siguiente enlace del MSDN.
Espero que el artículo os haya sido interesante, dentro de
areaTIC
puedes encontrar otros artículos, no dudes en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...)
No hay comentarios:
Publicar un comentario en la entrada