none
cambiar valor de campo identity RRS feed

  • Pregunta

  • saludos, tengo una tabla con un campo identity , pero he borrado algunso registros y ahora el primer registro tiene el número 801 y el último 850

    quisiera arreglarlo para que el 801 se vuelva 1 el 802 2 y asi como podría hacerlo

    gracias

    sábado, 16 de julio de 2016 16:01

Respuestas

  • Augusto C,

    ¿Tienes alguna necesidad de fondo para requerirlo? ¿Sólo es un tema de forma? Lo menciono -y es un tema que se ha tocado mucho en este foro- porque esas brechas las seguirás obteniendo en tanto borres registros o tengas transacciones truncas.

    ¿La tabla que mencionas es dependiente de otras tablas (es clave foranea para otras tablas)? Si lo es, entonces no será tan simple porque por regla de IR no puedes dejar sin referencia a una tabla dependiente, a menos que tengas establecido la regla ON UPDATE CASCADE.

    Siendo optimistas vamos por lo más simple:

    /*Copiamos las filas a una tabla temporal*/
    SELECT * INTO #TablaTemporal FROM MiTabla;
    
    /*Eliminamos las filas de la tabla con TRUNCATE*/
    TRUNCATE TABLE MiTabla;
    
    /*Pasamos las filas a la tabla nombrando las columnas menos la de IDENTITY*/
    INSERT INTO MiTabla (Col2, Col3) SELECT Valor2, Valo3 FROM #TablaTemporal;
    
    /*Borramos la tabla temporal*/
    DROP TABLE #TablaTemporal;

    Demás está advertirte que en casos como estos tomes las medidas del caso para no perder datos (copias de seguridad), y vuelvo a advertir que las brechas en la secuencia las seguirás obteniendo porque es parte del comportamiento que se espera de la propiedad IDENTITY().


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Augusto C martes, 19 de julio de 2016 16:28
    sábado, 16 de julio de 2016 16:22

Todas las respuestas

  • En SQL server no se puede cambiar el valor de un campo Identity. Una opción es modificar la columna para que no sea de tipo Identity (se puede hacer editando el diseño de la tabla desde SSMS) y después actualizar los valores. Otra opción es hacer un "SET IDENTITY INSERT latabla ON", copiar la fila entera en otra nueva (pero con el valor bueno en la columna del idantity) y luego borrar la fila vieja.
    sábado, 16 de julio de 2016 16:14
  • Hola Alberto

    -->Una opción es modificar la columna para que no sea de tipo Identity (se puede hacer editando el diseño de la tabla desde SSMS)

    Si esto es lo que había pensado pero me faltaría hacer la rutina con un while o cursor que modifique los id 

    sábado, 16 de julio de 2016 16:19
  • Augusto C,

    ¿Tienes alguna necesidad de fondo para requerirlo? ¿Sólo es un tema de forma? Lo menciono -y es un tema que se ha tocado mucho en este foro- porque esas brechas las seguirás obteniendo en tanto borres registros o tengas transacciones truncas.

    ¿La tabla que mencionas es dependiente de otras tablas (es clave foranea para otras tablas)? Si lo es, entonces no será tan simple porque por regla de IR no puedes dejar sin referencia a una tabla dependiente, a menos que tengas establecido la regla ON UPDATE CASCADE.

    Siendo optimistas vamos por lo más simple:

    /*Copiamos las filas a una tabla temporal*/
    SELECT * INTO #TablaTemporal FROM MiTabla;
    
    /*Eliminamos las filas de la tabla con TRUNCATE*/
    TRUNCATE TABLE MiTabla;
    
    /*Pasamos las filas a la tabla nombrando las columnas menos la de IDENTITY*/
    INSERT INTO MiTabla (Col2, Col3) SELECT Valor2, Valo3 FROM #TablaTemporal;
    
    /*Borramos la tabla temporal*/
    DROP TABLE #TablaTemporal;

    Demás está advertirte que en casos como estos tomes las medidas del caso para no perder datos (copias de seguridad), y vuelvo a advertir que las brechas en la secuencia las seguirás obteniendo porque es parte del comportamiento que se espera de la propiedad IDENTITY().


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Augusto C martes, 19 de julio de 2016 16:28
    sábado, 16 de julio de 2016 16:22
  • Augusto C,

    ¿Tienes alguna necesidad de fondo para requerirlo? ¿Sólo es un tema de forma? Lo menciono -y es un tema que se ha tocado mucho en este foro- porque esas brechas las seguirás obteniendo en tanto borres registros o tengas transacciones truncas.

    ¿La tabla que mencionas es dependiente de otras tablas (es clave foranea para otras tablas)? Si lo es, entonces no será tan simple porque por regla de IR no puedes dejar sin referencia a una tabla dependiente, a menos que tengas establecido la regla ON UPDATE CASCADE.

    Siendo optimistas vamos por lo más simple:

    /*Copiamos las filas a una tabla temporal*/
    SELECT * INTO #TablaTemporal FROM MiTabla;
    
    /*Eliminamos las filas de la tabla con TRUNCATE*/
    TRUNCATE TABLE MiTabla;
    
    /*Pasamos las filas a la tabla nombrando las columnas menos la de IDENTITY*/
    INSERT INTO MiTabla (Col2, Col3) SELECT Valor2, Valo3 FROM #TablaTemporal;
    
    /*Borramos la tabla temporal*/
    DROP TABLE #TablaTemporal;

    Demás está advertirte que en casos como estos tomes las medidas del caso para no perder datos (copias de seguridad), y vuelvo a advertir que las brechas en la secuencia las seguirás obteniendo porque es parte del comportamiento que se espera de la propiedad IDENTITY().


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    Hola Williams gracias por tu respuesta , el problema esque el id no se genera en el orden en que estaban los registros anteriormente
    sábado, 16 de julio de 2016 16:34
  • Augusto C,

    Las instrucciones que te he pasado resetean el contador de la columna (IDENTITY) al valor inicial y en la inserción se va produciendo nuevamente la secuencia (1, 2, 3, n+1,).

    Si quieres otorgar un valor explicito entonces puedes prender la configuración IDENTITY_INSERT

    SET IDENTITY_INSERT dbo.MiTabla  ON;
    INSERT INTO dbo.MiTabla (id, Col1, Col2) VALUES 
    (4, 'A', 1),
    (5, 'A', 1);
    SET IDENTITY_INSERT dbo.MiTabla  OFF;

    Nota que para la columna id (IDENTITY) inserto valores de forma explícita. Si no es lo que esperas te agradeceré te expliques con mayor detalle.
    sábado, 16 de julio de 2016 16:58
  • CAMBIAS LA PROPIEDAD DE AUTONUMERICO DE LA COLUMNA ID PONES EL ID Q QUIERES  EL CUALQUIER DATOS Y DESPUES LE PONES LA PROPIEDAD AUTONUMERICO
    lunes, 9 de abril de 2018 21:18
  • El campo identity se debe definir en una tabla que no sufrira modificaciones, en especial DELETE, ya que como comentas se "perderia" el consecutivo. Los DELETE deben ser LOGICOS, un campo de tipo boleano donde nos indique 1 activos, 0 inactivos.
    lunes, 9 de abril de 2018 22:02
  • con esto reinicias el valor al toque

    DBCC CHECKIDENT (<nombre_tabla>, RESEED,0)

    viernes, 25 de enero de 2019 18:09
  • Muy buena....
    lunes, 28 de octubre de 2019 21:17