none
CAMPOS IDENTITY RRS feed

  • Pregunta

  • Buenas Tardes, comunidad.

    Tengo esta duda tengo una tabla que tienen una columna que es PK y tienen un auto incremento de 1 a 1, la duda que tengo es la siguiente:

    en la tabla tengo estas dos lineas:

    874 ---- a

    900 ---- b

    lo que quiero hacer es invertir los números del campo identity, sin tener que borrar la tabla o remunerar los números del campo identity

     

    jueves, 7 de marzo de 2019 18:14

Respuestas

  • Buenos días, es afirmativo.

    Ah. entonces las cosas son mucho mas complicadas. Lo de que sea clave primaria no nos afecta, pero si el campo se usa como clave externa, entonces ya no vale el truco de borrar el registro y volverlo a añadir, como en el ejemplo que yo puse. Un campo que es clave externa se puede modificar si la clave externa se definió con la cláusula "on update cascade". Pero si el campo además es un identity entonces no nos sirve de nada porque el identity no se puede modificar (solo se puede borrar y volver a añadir, pero eso es incompatible con la clave externa).

    Creo que si tienes la necesidad de modificar ese campo la solución adecuada es replantear la estructura de la base de datos y separar la clave de negocio de la clave interna, en lugar de intentar usar un solo campo para ambas funciones. La clave interna es autogenerada y se usa para mantener la relación entre tablas (foreign key). Este es el ccampo que generamos como identity y que es invisible para todos los consumidores y por tanto jamás debe surgir la necesidad de cambiarle el valor. Y ese valor 874 o 900 que has mencionado es una clave de negocio (si no es así no te habría surgido la necesidad de cambiarlo), que se salva en otra columna y no es un identity y se puede cambiar cuando sea necesario. Este campo no se usa como clave externa. La base de datos se mantiene normalizada, de manera que ese dato existe en un único sitio y el resto de las tablas si lo necesitan lo obtienen mediante un Join siguiendo la clave interna.

    • Marcado como respuesta E_A_S_S viernes, 8 de marzo de 2019 17:44
    viernes, 8 de marzo de 2019 16:37

Todas las respuestas

  • Eso no es posible ya que las columnas con propiedad IDENTITY no pueden ser actualizadas.

    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Propuesto como respuesta Pedro Alfaro jueves, 7 de marzo de 2019 19:42
    jueves, 7 de marzo de 2019 18:22
  • Hay un truco para eso, que es ejecutar un "Set Identity_Insert [laTabla] ON". ENtonces te daja insertar valores del Identity. Usas eso para copiar los registros con otro número, y luego lo vuelves a poner en OFF.

    -- Construir tabla de prueba
    create table Mitabla (
        Id int identity primary key,
    	Texto varchar(10)
    )
    go
    
    -- Insertar datos de prueba
    set identity_insert Mitabla on
    Insert into MiTabla(Id, Texto) values(874,'a'),(900,'b')
    set identity_insert Mitabla on
    go
    
    -- Ver los datos
    select * from Mitabla
    
    -- Realizar el intercambio
    set identity_insert Mitabla on
    Insert into MiTabla(Id,Texto) select 9999999, Texto from MiTabla where Id=874
    Delete from MiTabla where Id=874
    Insert into MiTabla(Id,Texto) select 874, Texto from MiTabla where Id=900
    Delete from MiTabla where Id=900
    Insert into MiTabla(Id,Texto) select 900, Texto from MiTabla where Id=9999999
    Delete from MiTabla where Id=9999999
    set identity_insert Mitabla on
    
    -- Ver los datos
    select * from Mitabla
    

    jueves, 7 de marzo de 2019 19:45
  • Deleted
    jueves, 7 de marzo de 2019 22:20
  • Buenos días, es afirmativo.
    viernes, 8 de marzo de 2019 14:58
  • Buenos días, es afirmativo.

    Ah. entonces las cosas son mucho mas complicadas. Lo de que sea clave primaria no nos afecta, pero si el campo se usa como clave externa, entonces ya no vale el truco de borrar el registro y volverlo a añadir, como en el ejemplo que yo puse. Un campo que es clave externa se puede modificar si la clave externa se definió con la cláusula "on update cascade". Pero si el campo además es un identity entonces no nos sirve de nada porque el identity no se puede modificar (solo se puede borrar y volver a añadir, pero eso es incompatible con la clave externa).

    Creo que si tienes la necesidad de modificar ese campo la solución adecuada es replantear la estructura de la base de datos y separar la clave de negocio de la clave interna, en lugar de intentar usar un solo campo para ambas funciones. La clave interna es autogenerada y se usa para mantener la relación entre tablas (foreign key). Este es el ccampo que generamos como identity y que es invisible para todos los consumidores y por tanto jamás debe surgir la necesidad de cambiarle el valor. Y ese valor 874 o 900 que has mencionado es una clave de negocio (si no es así no te habría surgido la necesidad de cambiarlo), que se salva en otra columna y no es un identity y se puede cambiar cuando sea necesario. Este campo no se usa como clave externa. La base de datos se mantiene normalizada, de manera que ese dato existe en un único sitio y el resto de las tablas si lo necesitan lo obtienen mediante un Join siguiendo la clave interna.

    • Marcado como respuesta E_A_S_S viernes, 8 de marzo de 2019 17:44
    viernes, 8 de marzo de 2019 16:37
  • Buenas días, gracias por tu respuesta.

    Me surgió este detalle porque tengo este problema, el registro con el id 874 se me corrompió por que no extrae los datos del registro cuando selecciona y cree otro registro con los mismo datos pero el id es 900 y este cuanto lo seleccionan si trae los registros, lo que quería hacer es intercambiar los números id, pero con tu explicación me queda claro que no puedo.

    Saludos. 

    viernes, 8 de marzo de 2019 17:44