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