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

Ayuda con clave primaria

Estas en el tema de Ayuda con clave primaria en el foro de Oracle en Foros del Web. Hola. Tengo una consulta respecto a las secuencias. Tengo un primary key compuesto (pk1 number, pk2 varchar2, pk3 varchar2), donde el pk1 debe incrementarse por ...
  #1 (permalink)  
Antiguo 23/12/2008, 13:30
Avatar de calanko  
Fecha de Ingreso: diciembre-2008
Mensajes: 4
Antigüedad: 16 años
Puntos: 0
Ayuda con clave primaria

Hola.
Tengo una consulta respecto a las secuencias. Tengo un primary key compuesto (pk1 number, pk2 varchar2, pk3 varchar2), donde el pk1 debe incrementarse por cada combinación entre pk2 y pk3. Por ejemplo:

Para un pk1 = 01 y pk2 = XX el primer pk1 debe ser 1,
Para un pk1 = 01 y pk2 = XY el primer pk1 debe ser 1,
Para un pk1 = 02 y pk2 = XX el primer pk1 debe ser 1,
etc.
Los siguientes deben incrementarse para cada combinación.

El objeto sequence me permite solucionar este problema? si es así cómo?, sino, existe alguna otra forma de hacerlo?.

Gracias de antemano.
  #2 (permalink)  
Antiguo 31/12/2008, 04:09
 
Fecha de Ingreso: diciembre-2008
Mensajes: 7
Antigüedad: 16 años
Puntos: 0
Respuesta: Ayuda con clave primaria

no se te entiende podrias dar mas ejemplos asi te ayudo.
yo lo solucionaria con un trigger que cuando se inserte un dato genere las otras claves como quieras
  #3 (permalink)  
Antiguo 31/12/2008, 07:40
 
Fecha de Ingreso: diciembre-2008
Mensajes: 13
Antigüedad: 16 años
Puntos: 0
Respuesta: Ayuda con clave primaria

Pues para tipos de llaves compuestas en dondes se requieran convinaciones especiales yo siempre utilizo un trigger antes de que se ejecute el insert
  #4 (permalink)  
Antiguo 31/12/2008, 17:32
Avatar de calanko  
Fecha de Ingreso: diciembre-2008
Mensajes: 4
Antigüedad: 16 años
Puntos: 0
Respuesta: Ayuda con clave primaria

Holas.
Bertolita tienes razon, debe ser:
Para un pk3 = 01 y pk2 = XX el primer pk1 debe ser 1,
Para un pk3 = 01 y pk2 = XY el primer pk1 debe ser 1,
Para un pk3 = 02 y pk2 = XX el primer pk1 debe ser 1,
etc.

y los siguientes de cada combinacion deben incrementarse.

Con respecto a los trigger.
Estoy trabajando con persistencia de objetos con hibernate, y cuando ingreso un id (o un campo del id compuesto) nulo salta la restriccion de primary key. No lo probe con un trigger asi que lo haré, pero si hay otra forma, por favor avisenme.

Gracias otra vez .
  #5 (permalink)  
Antiguo 02/01/2009, 12:05
 
Fecha de Ingreso: diciembre-2008
Mensajes: 7
Antigüedad: 16 años
Puntos: 0
Respuesta: Ayuda con clave primaria

Cita:
Iniciado por calanko Ver Mensaje
Holas.
Bertolita tienes razon, debe ser:
Para un pk3 = 01 y pk2 = XX el primer pk1 debe ser 1,
Para un pk3 = 01 y pk2 = XY el primer pk1 debe ser 1,
Para un pk3 = 02 y pk2 = XX el primer pk1 debe ser 1,
etc.

y los siguientes de cada combinacion deben incrementarse.

Con respecto a los trigger.
Estoy trabajando con persistencia de objetos con hibernate, y cuando ingreso un id (o un campo del id compuesto) nulo salta la restriccion de primary key. No lo probe con un trigger asi que lo haré, pero si hay otra forma, por favor avisenme.

Gracias otra vez .


claro el tema es que no entiendo vos queres generar la pk1 pero siempre es 1?
  #6 (permalink)  
Antiguo 02/01/2009, 12:33
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 17 años, 1 mes
Puntos: 3
Respuesta: Ayuda con clave primaria

Te propongo algo amigo...

Tu clave compuesta la separemos en campos

PK2 es COLUMNA_B
PK3 es COLUMNA_C
y
PK1 es COLUMNA_A

ok...

Las secuencias en Oracle son solo numeros que inician en un valor y van incrementando mediante un pedido explicito, o sea, usando la funcion "nextval".

Aqui veo dos cuestiones muy diferentes...

Lo que tu debes hacer es separar los datos que van a la tabla y los datos que vas a mostrar. Si?
Si usas UNICAMENTE la COLUMNA_A como clave primaria, solucionas tu problema... un solo campo, una sola secuencia, obtienes tu "primary key".

Entonces sin importar las combinaciones de los valores de las COLUMNA_B y COLUMNA_C tu mantienes tu clave primaria que es COLUMNA_A.
De esta manera verias algo asi despues de un tiempo...

COLUMNA_A COLUMNA_B COLUMNA_C
1 01 XX
2 01 XX
3 02 XY
4 03 XX
5 02 XY
6 01 XX

Si filtras por COLUMNA_B = '01' y COLUMNA_C = 'XX' tendrias lo siguiente...

COLUMNA_A COLUMNA_B COLUMNA_C
1 01 XX
2 01 XX
6 01 XX

tu me diras... "pero no es lo que yo quiero, necesito que sea secuencial!!!!"

Ok, ahora viene la parte debes comprender: que la COLUMNA_A es de uso "interno", se ve unicamente en la BD, el cliente no ve nunca este campo.

La solucion ahora es ordenar la busqueda anterior por COLUMNA_A, generando una COLUMNA_A_PRIMA que devuelta el siguiente resultado :

COLUMNA_A_PRIMA COLUMNA_B COLUMNA_C
1 01 XX
2 01 XX
3 01 XX

Se entiende?? Esto es lo que me parece, deberias implementar...
Es muy complicado y ademas dificil de mantener lo que tu quieres hacer "directamente" en la tabla.

Cualquier duda, estoy a disposicion.

Saludos, Mario.
__________________
Y venció David al filisteo con honda y piedra; e hirió al filisteo y lo mató, sin tener David espada en su mano.
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




La zona horaria es GMT -6. Ahora son las 08:44.