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

Cómo hago para que una FOREIGN KEY herede de PRIMARY KEY

Estas en el tema de Cómo hago para que una FOREIGN KEY herede de PRIMARY KEY en el foro de Oracle en Foros del Web. Hola! Bueno, se me plantea el siguiente problema. Yo tengo una tabla que es así: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original CREATE TABLE IMAGENES   ...
  #1 (permalink)  
Antiguo 14/08/2015, 13:51
Avatar de Kursakez  
Fecha de Ingreso: agosto-2015
Mensajes: 19
Antigüedad: 9 años, 3 meses
Puntos: 1
Cómo hago para que una FOREIGN KEY herede de PRIMARY KEY

Hola!

Bueno, se me plantea el siguiente problema. Yo tengo una tabla que es así:
Código SQL:
Ver original
  1. CREATE TABLE IMAGENES
  2.   (
  3.     foto   VARCHAR2 (250) PRIMARY KEY,
  4.     codigo VARCHAR2 (10) NOT NULL,
  5.     FOREIGN KEY (codigo) REFERENCES PRODUCTOS (codigo)
  6.   );

que es la tabla que quiero que herede el código de esta:

Código SQL:
Ver original
  1. CREATE TABLE PRODUCTOS
  2.   (
  3.     codigo        VARCHAR2 (10) PRIMARY KEY,
  4.     nombre        VARCHAR2 (20) NOT NULL,
  5.     precio        NUMBER (5,2) NOT NULL,
  6.     descripcion   VARCHAR2 (140) NOT NULL,
  7.     genero        VARCHAR2 (5),
  8.     color         VARCHAR2 (100),
  9.     tipo_producto VARCHAR2 (100),
  10.     temporada     VARCHAR2 (8),  
  11.     UNIQUE(codigo, nombre, precio, temporada),
  12.     CONSTRAINT e_genero CHECK (genero              ='varon'
  13.   OR genero                                        ='mujer'),
  14.     CONSTRAINT e_tipo_producto CHECK (tipo_producto='babero'
  15.   OR tipo_producto                                 ='camiseta'
  16.   OR tipo_producto                                 ='pantalon'
  17.   OR tipo_producto                                 ='vestido'
  18.   OR tipo_producto                                 ='zapatos'
  19.   OR tipo_producto                                 ='diadema'
  20.   OR tipo_producto                                 ='calcetines'),
  21.   CONSTRAINT e_temporada CHECK (temporada          ='verano'
  22.   OR temporada                                     ='invierno')
  23.   );

Tengo entendido que en Oracle SQL Developer no puedo usar ON UPDATE CASCADE, entonces como hago para que al insertar en PRODUCTOS el valor de la PRIMARY KEY, este se inserte también en la FOREIGN KEY en IMAGENES.

Gracias por adelantado!

Última edición por gnzsoloyo; 14/08/2015 a las 13:55 Razón: Código pésimamente etiquetado. Usar HIGHLITS
  #2 (permalink)  
Antiguo 14/08/2015, 14:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Cómo hago para que una FOREIGN KEY herede de PRIMARY KEY

Cita:
Tengo entendido que en Oracle SQL Developer no puedo usar ON UPDATE CASCADE, entonces como hago para que al insertar en PRODUCTOS el valor de la PRIMARY KEY, este se inserte también en la FOREIGN KEY en IMAGENES.
Lo que dices no tiene sentido. Las capacidades del Oracle Developer en cuanto a esa cláusula dependen de Oracle, no de la interfaz.
OD no tiene forma de restringir lo que se puede o no hacer por definición en oracle.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 14/08/2015, 14:11
Avatar de Kursakez  
Fecha de Ingreso: agosto-2015
Mensajes: 19
Antigüedad: 9 años, 3 meses
Puntos: 1
Respuesta: Cómo hago para que una FOREIGN KEY herede de PRIMARY KEY

Pero me tira error en cuanto pongo ON UPDATE CASCADE. Es que "codigo" en la tabla PRODUCTOS es una primary key que se crea a partir de una FUNCTION, esta:
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION generaCodProd
  2.   (
  3.   w_genero        IN productos.genero%TYPE,
  4.   w_color         IN productos.color%TYPE,
  5.   w_tipo_producto IN productos.tipo_producto%TYPE  
  6.   )
  7.   RETURN VARCHAR2
  8.   IS
  9.   w_codigo productos.codigo%TYPE;
  10.   BEGIN
  11.   w_codigo:=CONCAT(SUBSTR(w_genero, 1, 1),CONCAT(SUBSTR(w_color, 1, 1),CONCAT(SUBSTR(w_tipo_producto, 1, 3),CODIGO.NEXTVAL)));
  12.   RETURN (w_codigo);
  13.   END;
  14.   /

Donde CODIGO.NEXTVAL es el valor de la secuencia definida así:

Código SQL:
Ver original
  1. CREATE SEQUENCE CODIGO MINVALUE 0 INCREMENT BY 1 START WITH 0 MAXVALUE 99999;

Entonces no sé como regularlas para que al insertar en PRODUCTOS con un CODIGO pueda insertar en IMAGENES con el mismo CODIGO, para luego poder asociarlas por los codigos.
  #4 (permalink)  
Antiguo 14/08/2015, 14:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Cómo hago para que una FOREIGN KEY herede de PRIMARY KEY

Cita:
Pero me tira error en cuanto pongo ON UPDATE CASCADE.
Empieza por explicar qué error te da y con qué código ORA es.

Cita:
para que al insertar en PRODUCTOS con un CODIGO pueda insertar en IMAGENES con el mismo CODIGO
Para eso simplemente debes conservar el código generado y usarlo nuevamente cuando INSERTAS la imagen...
La verdad es que descripto como lo haces no parece que haya problemas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 14/08/2015, 14:22
Avatar de Kursakez  
Fecha de Ingreso: agosto-2015
Mensajes: 19
Antigüedad: 9 años, 3 meses
Puntos: 1
Respuesta: Cómo hago para que una FOREIGN KEY herede de PRIMARY KEY

Sí, perdón. El error que me da es este y con este código:

Código SQL:
Ver original
  1. Error que empieza en la línea: 128 del comando -
  2. CREATE TABLE IMAGENES
  3.   (
  4.     foto   VARCHAR2 (250) PRIMARY KEY,
  5.     codigo VARCHAR2 (10) NOT NULL,
  6.     FOREIGN KEY (codigo) REFERENCES PRODUCTOS (codigo) ON UPDATE CASCADE
  7.   )
  8. Error en la línea de comandos : 132 Columna : 59
  9. Informe de error -
  10. Error SQL: ORA-00905: missing keyword
  11. 00905. 00000 -  "missing keyword"
  12. *Cause:    
  13. *Action:

*Cause y *Action me los da vacíos. Si quito ON UPDATE CASCADE no me da error.
  #6 (permalink)  
Antiguo 14/08/2015, 14:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Cómo hago para que una FOREIGN KEY herede de PRIMARY KEY

Eso no es un error de imposibilidad... Te está diciendo que falta una palabra clave.
Código SQL:
Ver original
  1. CREATE TABLE IMAGENES
  2.   (
  3.     foto   VARCHAR2 (250) PRIMARY KEY,
  4.     codigo VARCHAR2 (10) NOT NULL,
  5.     CONSTRAINT kf_codigo_prod FOREIGN KEY (codigo) REFERENCES PRODUCTOS (codigo) ON UPDATE CASCADE
  6.   )

De acuerdo al manual de referencia, cuando el ON UPDATE CASCADE lo pones en una linea diferente a la definición del campo, debe ir con CONSTRAINT y el nombre asignado al indice.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 15/08/2015, 02:41
Avatar de Kursakez  
Fecha de Ingreso: agosto-2015
Mensajes: 19
Antigüedad: 9 años, 3 meses
Puntos: 1
Respuesta: Cómo hago para que una FOREIGN KEY herede de PRIMARY KEY

Me sigue tirando el mismo error :S

Código SQL:
Ver original
  1. Error que empieza en la línea: 128 del comando -
  2. CREATE TABLE IMAGENES
  3.   (
  4.     foto   VARCHAR2 (250) PRIMARY KEY,
  5.     codigo VARCHAR2 (10) NOT NULL,
  6.     CONSTRAINT kf_codigo_prod FOREIGN KEY (codigo) REFERENCES PRODUCTOS (codigo) ON UPDATE CASCADE
  7.   )
  8. Error en la línea de comandos : 132 Columna : 85
  9. Informe de error -
  10. Error SQL: ORA-00905: missing keyword
  11. 00905. 00000 -  "missing keyword"
  12. *Cause:    
  13. *Action:

Etiquetas: key, primary, sql
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 07:39.