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

error en foreign key al intentar crear tablas

Estas en el tema de error en foreign key al intentar crear tablas en el foro de Mysql en Foros del Web. Buenas tardes! Soy estudiante de ASIR y tengo un problema con la creación de tablas para una base de datos que nos han mandado de ...
  #1 (permalink)  
Antiguo 01/02/2015, 14:09
 
Fecha de Ingreso: febrero-2015
Mensajes: 8
Antigüedad: 9 años, 9 meses
Puntos: 0
error en foreign key al intentar crear tablas

Buenas tardes! Soy estudiante de ASIR y tengo un problema con la creación de tablas para una base de datos que nos han mandado de trabajo para el fin de semana. Ya creé 3 tablas y a la hora de hacer las dos últimas, me da error, en teoría relacionados con las foreign keys (ambas dos tablas que pretendo crear y no consigo, llevan varias). El caso es que revisé minuciosamente campo por campo las tablas referenciadas a ver si encontraba algo que no coincidiese y no he encontrado nada. Todos las foreign keys referenciadas se encuentran en otras tablas donde son primary keys. Este es el script:
Código SQL:
Ver original
  1. CREATE TABLE ventas(nif VARCHAR(10) NOT NULL,
  2. articulo VARCHAR(20) NOT NULL,
  3. cod_fabricante INT NOT NULL,
  4. peso INT NOT NULL,
  5. categoria VARCHAR(10) NOT NULL,
  6. fecha_venta DATE NOT NULL,
  7. unidades_vendidas INT,
  8.  
  9. PRIMARY KEY(nif, articulo, cod_fabricante, peso, categoria,
  10. fecha_venta),
  11.  
  12. FOREIGN KEY (cod_fabricante) REFERENCES fabricantes(cod_fabricante),
  13.  
  14. FOREIGN KEY(articulo) REFERENCES articulos(articulo)
  15. ON DELETE cascade ON UPDATE cascade,
  16.  
  17. FOREIGN KEY(cod_fabricante) REFERENCES articulos(cod_fabricante)
  18. ON DELETE cascade ON UPDATE cascade,
  19.  
  20. FOREIGN KEY(peso) REFERENCES articulos(peso)
  21. ON DELETE cascade ON UPDATE cascade,
  22.  
  23. FOREIGN KEY(categoria) REFERENCES articulos(categoria)
  24. ON DELETE cascade ON UPDATE cascade);
  25.  
  26.  
  27. CREATE TABLE pedidos(nif VARCHAR(10),articulo VARCHAR(20) NOT NULL,
  28. cod_fabricante INT NOT NULL, peso INT NOT NULL, categoria VARCHAR(10) NOT NULL,
  29. fecha_pedido DATE NOT NULL, unidades_pedidas INT,
  30.  
  31. PRIMARY KEY(nif, articulo, cod_fabricante, peso, categoria, fecha_pedido),
  32.  
  33. FOREIGN KEY(nif) REFERENCES tiendas(nif),
  34.  
  35. FOREIGN KEY(articulo) REFERENCES articulos(articulo)
  36. ON DELETE cascade ON UPDATE cascade,
  37.  
  38. FOREIGN KEY(cod_fabricante) REFERENCES articulos(cod_fabricante)
  39. ON DELETE cascade ON UPDATE cascade,
  40.  
  41. FOREIGN KEY(peso) REFERENCES articulos(peso)
  42. ON DELETE cascade ON UPDATE cascade,
  43.  
  44. FOREIGN KEY(categoria) REFERENCES articulos(categoria)
  45. ON DELETE cascade ON UPDATE cascade);
Probé a meter las foreign keys una a una en cada tabla, y las que me dan error son las dos últimas (peso y categoría). Las demás entran, en las dos tablas que intento crear.
Agradeceria un poco de ayuda. Gracias de antemano!!!!

Última edición por gnzsoloyo; 01/02/2015 a las 14:33
  #2 (permalink)  
Antiguo 01/02/2015, 14:48
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: error en foreign key al intentar crear tablas

¿Tienes claro que una FK es un campo o conjunto de campos que referencia ala PK de otra tabla?
Bueno, si eso lo tienes claro, estas FK están mal:
Código MySQL:
Ver original
  1. FOREIGN KEY (cod_fabricante) REFERENCES fabricantes(cod_fabricante),
  2.  
  3. FOREIGN KEY(cod_fabricante) REFERENCES articulos(cod_fabricante)
  4. ;
Cod_fabricante solo puede referenciar a una tabla no a dos.

Estas también:
Código MySQL:
Ver original
  1. FOREIGN KEY(articulo) REFERENCES articulos(articulo)
  2.  
  3. FOREIGN KEY(cod_fabricante) REFERENCES articulos(cod_fabricante)
  4.  
  5. FOREIGN KEY(peso) REFERENCES articulos(peso)
  6.  
  7. FOREIGN KEY(categoria) REFERENCES articulos(categoria)
Estás intentando referenciar cuatro campos distintos a una misma tabla, lo que sólo podría darse si los cuatro o tres de ellos apuntan a campos con indices UNIQUE... y francamente no creo que "peso" pueda se run campo de ese tipo.

Con la segunda tabla cometes el mismo tipo de errores.


Por otro lado, a nivel de diseño me resulta poco creíble que la PK de una venta se defina con esos cuatro campos. Me da la impresión de que el sistema esté mal planteado o mal diseñado.

Necesitas un repaso de los conceptos basicos de FK/PK
__________________
¿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 01/02/2015, 16:07
 
Fecha de Ingreso: febrero-2015
Mensajes: 8
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: error en foreign key al intentar crear tablas

Gracias por tu respuesta!
Pues quizá el enunciado del ejercicio esté mal, me cuesta creer que la profesora nos haya dado un ejercicio que otros años ya ha utilizado y que esté mal, pero bueno...
El caso es que sí, creo que tengo claros los conceptos de PK y FK aunque a veces me da la sensación de que no es así cuando ocurren cosas como éstas.
Volviendo al ejercicio en sí, por raro que parezca, en la tabla referenciada (artículos), la Pk está compuesta por cuatro campos: (articulo, cod_fabricante, peso y categoría).

También dice lo siguiente con respecto a la creación de la tabla VENTAS. Copio y pego:

COD_FABRICANTE es clave ajena que referencia a la tabla FABRICANTES.
 Las columnas ARTICULO, COD_FABRICANTE, PESO Y CATEGORIA son clave ajena y referencia a la tabla ARTICULOS. Realizar un borrado en cascada.

Y si, a mí también me parece un error de diseño meter esos cuatro campos como PK...
  #4 (permalink)  
Antiguo 01/02/2015, 16:16
 
Fecha de Ingreso: febrero-2015
Mensajes: 8
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: error en foreign key al intentar crear tablas

Lo he intentado hacer de otra manera, no me da error pero no me figuran como FK's si lo compruebo en el menú navigator. Lo que hice fué crear una foreign key con 4 campos, osea:

foreign key(articulo, cod_fabricante, peso, categoría) references articulos(articulo, cod_fabricante, peso, categoria) on delete cascade on update cascade);

Tampoco sé si esto se puede hacer (foreign key compuesta de varios campos) ya que en los apuntes no nos figura ningún ejemplo.
  #5 (permalink)  
Antiguo 01/02/2015, 16: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: error en foreign key al intentar crear tablas

Para que artículo, cod_fabricante, peso y categoría fuesen FK de otra tabla, los cuatro campos deberían ser la PK en la tabla Artículos, es decir, la tabla artículos debe forzosamente tener una PK compuesta.
Eso, por definición.

En el caso específico de MySQL, admite referenciar FK a una clave no primaria si y sólo si la clave a la que apunta es de un indice UNIQUE. DE lo contrario la FK no se puede crear.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 01/02/2015, 16:26
 
Fecha de Ingreso: febrero-2015
Mensajes: 8
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: error en foreign key al intentar crear tablas

Efectivamente, en la tabla ARTÍCULO tengo una PK compuesta de esos 4 campos...
  #7 (permalink)  
Antiguo 01/02/2015, 17:07
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: error en foreign key al intentar crear tablas

Pues en ese caso lo que no estás viendo es el detalle de que una FK, como objeto compuesto, apunta a una PK que es compuesta...
Es decir, no puedes apuntar cada campo, sino que tienes que poner todos los campos en el mismo orden que están en la PK de referencia, y tienen que estás en el mismo orden de la PK, y ser exactamente del mismo tipo, rango y collation.
Además de eso, si la tabla de la FK ya tiene registros almacenados, es mejor borrarlos, porque si uno solo no cumple con la restricción no te dejará crear la FK.

Verifica los campos definidos en la PK y comprueba que sean exactamente del mismo tipo, rango, collation (si son de caracteres) y en el mismo orden.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 02/02/2015, 03:31
 
Fecha de Ingreso: febrero-2015
Mensajes: 8
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: error en foreign key al intentar crear tablas

No hay datos insertados aún pero por si acaso voy a borrar las tablas referenciadas y volver a hacerlas fijándome en todo lo que me dices.
Muchísimas gracias por tu ayuda gnzsoloyo!
  #9 (permalink)  
Antiguo 02/02/2015, 04:28
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: error en foreign key al intentar crear tablas

No te olvides de cuidar el orden de creación. La tabla referida debe existir antes de la que tiene la FK que la apunta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, fecha, key, tabla, tablas, update
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 03:17.