Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Cambiar clave primaria por una secuencia

Estas en el tema de Cambiar clave primaria por una secuencia en el foro de Oracle en Foros del Web. Hola Actualmente tengo una tabla en una BD cuya clave primaria son 2 campos (Campo1, Campo2) y me gustaría cambiar dicha clave a una secuencia ...
  #1 (permalink)  
Antiguo 25/06/2008, 02:44
Avatar de javimartinez  
Fecha de Ingreso: marzo-2003
Ubicación: Leganés (Madrid)
Mensajes: 284
Antigüedad: 21 años, 8 meses
Puntos: 1
Cambiar clave primaria por una secuencia

Hola

Actualmente tengo una tabla en una BD cuya clave primaria son 2 campos (Campo1, Campo2) y me gustaría cambiar dicha clave a una secuencia de números, es decir, el típico ID.

El problema es que, al tener que rellenar la nueva clave con los valores de secuencia en todos los registros ya existentes todas las soluciones que se me ocurren conllevan la utilización de un proceso en código (Java en este caso). ¿Se podría hacer este cambio mediante un script SQL? ¿Cómo?

Gracias y un saludo :)
__________________
Javi Martínez

Web: Acertijolandia Blog: A Entretenerse
  #2 (permalink)  
Antiguo 25/06/2008, 03:24
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: Cambiar clave primaria por una secuencia

Hola, el proceso es sencillo, pero si la tabla tiene hijos puede complicarse.

Asumo que la secuencia ya la tienes creada. Añade a la tabla un campo number, luego montas un pequeño bloque pl-sql con un cursor que te recoja unicamente la PK de la tabla y lo declaras con la coletilla FOR UPDATE NOWAIT.

Ya solo te queda hacer en cada registro que te recupera el cursor, preguntando por los dos campos que forman la PK, un update del campo que te acabas de crear con el nextval de la secuencia.

Si tienes mas dudas, pregunta.

EDITO : Ovbiamente luego tendrás que hacer un drop de la PK antigüa y un create de la nueva.
  #3 (permalink)  
Antiguo 25/06/2008, 03:55
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: Cambiar clave primaria por una secuencia

Hola,

Esta semana estoy anti-cursores, no es que sean malos o que no cumplan con su trabajo, es solo que se utilizan en exceso y son mucho mas lentos.

Código:
oracle@10G> create sequence s1 start with 1 increment by 1;

Secuencia creada.

oracle@10G> select * from t1;

        ID DATA
---------- ----------
           data1
           data2
           data3
           data4
           data5
           data6

6 filas seleccionadas.

oracle@10G> update t1 set id = s1.nextval;

6 filas actualizadas.

oracle@10G> select * from t1;

        ID DATA
---------- ----------
         1 data1
         2 data2
         3 data3
         4 data4
         5 data5
         6 data6

6 filas seleccionadas.
Despues tienes que actualizar las tablas hijas pasando el valor de la nueva PK y haciendo un JOIN con la antigua PK.

Saludos
  #4 (permalink)  
Antiguo 25/06/2008, 04:47
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: Cambiar clave primaria por una secuencia

Mejor solucion que la mia, mas rápida y te quitas de historias.

No estaba seguro si al hacer el update se actualizaban todas las filas con el mismo nextval o como has puesto tu, ahora ya lo sé , je je je je
  #5 (permalink)  
Antiguo 25/06/2008, 05:05
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: Cambiar clave primaria por una secuencia

Hola,

Y ahora en 11g te permite asignar el valor de una secuencia a una variable en forma directa, por ejemplo

Código:
declare
  i number(8);
begin

  i := s1.nextval;

end;
Ya no hace falta hacer un select into from dual

Saludos
  #6 (permalink)  
Antiguo 25/06/2008, 11:21
Avatar de javimartinez  
Fecha de Ingreso: marzo-2003
Ubicación: Leganés (Madrid)
Mensajes: 284
Antigüedad: 21 años, 8 meses
Puntos: 1
Respuesta: Cambiar clave primaria por una secuencia

Muchas gracias a los 2 por las respuestas :)

La que más me ha gustado es la primera de matanga, no sabía que eso funcionaría!!!!! pero es justo lo que buscaba, un script con sql simplemente para poder enviarlo sin problemas a la persona encargada de la BD.

Saludos :)
__________________
Javi Martínez

Web: Acertijolandia Blog: A Entretenerse
  #7 (permalink)  
Antiguo 25/06/2008, 14:33
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 9 meses
Puntos: 7
Respuesta: Cambiar clave primaria por una secuencia

Cita:
Iniciado por matanga Ver Mensaje
Hola,

Y ahora en 11g te permite asignar el valor de una secuencia a una variable en forma directa, por ejemplo

Código:
declare
  i number(8);
begin

  i := s1.nextval;

end;
Ya no hace falta hacer un select into from dual

Saludos
ya decia yo que eso deberia de existir
__________________
Blogzote.com :-) Mi blog
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 02:01.