viernes, 16 de noviembre de 2012

SQL Server: Insertar valor en columna Identity

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...)


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET

No hay comentarios:

Publicar un comentario en la entrada