lenguaje SQL, Bases de datos, Procedimientos Almacenados y SQL server

Lenguaje SQL - Bases de datos - SQL Server

    
  Buscar   

Inicio

Help Desk

Foros SQL

Tutoriales SQL
 General
 Lenguaje SQL
 SQL Server
 MySQL
 Proc. Almacenados
 Programación .NET

Manuales SQL

Libros SQL

Enlaces

Programacion

Acerca de...

Entrar
Registro

Lenguaje SQL, bases de datos y SQL Server

MSDN: U.S. Local Highlights
The latest developer information for the United States.
  • Read the Amazing Adventures of Kevlarr and the Security Development Lifecycle
    Follow the quest of Kevlarr, an ordinary software developer, as he learns to find his inner super powers to build and protect a more fortified application. Will he succeed in time for launch?

  • See What's Happening in the Windows Internet Explorer Developer Center
    Visit the Windows Internet Explorer Developer Center to try out Internet Explorer 8 Beta 2 and get access to resources for building great-looking, cross-browser Web sites.

  • Introducing Expression Blend to Silverlight 2 Developers
    Watch this video to find out more about Expression Blend.


    Last Refreshed 1/6/2009 12:33:31 AM

  •  


    Inicio > Tutoriales SQL > General    
    Identidad: Cambiar valores de campo Identity

    Enviado por   el Monday, February 09, 2004 (Her)

    Los valores identity no deben tener significado real, pero aún así hay veces en las que necesitamos modificar o recueperar esos valores...

    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.


     
     



    WEBS RECOMENDADAS
    Programacion.com
    La Web del Programador
    Talleres del Web

    Artículos más Vistos
  • ¿Como manejar las fechas en Sql Server?
    Manejar las fechas en SQL Server es una de las preguntas más recurrentes en los foros. Maximiliano Damian nos explica como tratarlas

  • INSTALACION DE MYSQL 5 EN WINDOWS (I)
    MySQL es un servidor de bases de datos que cada vez tiene más adeptos. No nos da tantas facilidades ni funcionalidades como el SQL Server, pero es una optión a tener en cuenta...

  • SQL Dinámico: Exec y sp_executeSql
    La ejecución dinámica de instrucciones SQL es una potente herramienta a la que tarde o temprano tenemos que enfrentarnos.

  • Tablas temporales en el SQL Server
    En el mundo de las bases de datos es muy común la utilización de tablas temporales. Vamos a ver com hacer buen uso de ellas...

  • FAQ: Conexión con base de datos en ASP.NET con C#
    Vamos a ver de manera sencilla como mostrar el contenido de una tabla de Access en una página Web.

  •  

    Mensajes Nuevos

  • Academias ESPOL
    Enviado por paoyanez el Monday, December 29, 2008 (Her)

  • Unificacion de Datos
    Enviado por ? el Saturday, October 04, 2008 (Her)

  • qfopbmufuq
    Enviado por ? el Wednesday, October 01, 2008 (Her)

  • fpgaedac
    Enviado por ? el Sunday, September 28, 2008 (Her)

  • GENERACION DE TABLA EN PROCEDIMIENTOS
    Enviado por EDCOTA el Friday, September 26, 2008 (Her)



  •  

    Inicio   |   Help Desk   |   Foros SQL   |   Tutoriales SQL   |   Manuales SQL   |   Libros SQL   |   Enlaces   |   Programacion   |   Acerca de...

    Lenguaje SQL - Bases de Datos - SQL Server

    Diseño Paginas Web Codice DT

    Tarot por Telefono