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

Error al crear tablas con claves foraneas en el phpmyadmin

Estas en el tema de Error al crear tablas con claves foraneas en el phpmyadmin en el foro de Mysql en Foros del Web. Hola gente, tengo un problema al crear unas tablas. La cuestion es que el phpmyadmin no quiere crear las tablas correspondientes a las categorias (por ...
  #1 (permalink)  
Antiguo 30/09/2010, 02:28
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 9 meses
Puntos: 269
Error al crear tablas con claves foraneas en el phpmyadmin

Hola gente, tengo un problema al crear unas tablas.
La cuestion es que el phpmyadmin no quiere crear las tablas correspondientes a las categorias (por favor ver el código y la imagen adjunta que estan al final).

Ellas son: categoria1, categoria2 y categoria3.
Devolviéndome el siguiente error: #1072 - Key column 'id_categoria_productos' doesn't exist in table

Interpreto que algo pasa con las relaciones FK entre las categorias y la tabla 'categoria_productos'

Aclaro que las tablas 'categoria_productos' y 'productos' se crean correctamente
¿Alguien puede decirme porque sucede esto, acaso no puedo utilizar una clave primaria como relación para más de una tabla?

Aquí les dejo el código.

Código:
CREATE TABLE categoria_productos 
(

  id_categoria_productos INT NOT NULL ,

  categoria1 INT ,
  
  categoria2 INT ,

  categoria3 INT ,

  PRIMARY KEY (id_categoria_productos) 
)

TYPE = InnoDB;



CREATE TABLE productos (

  id_productos INT NOT NULL,

  codigo VARCHAR(255) ,

  nombre VARCHAR(255) ,

  descripcion TEXT ,

  imagen VARCHAR(255) ,

  imagen_miniatura VARCHAR(255) ,

  imagen_descriptiva VARCHAR(255) ,

  alto VARCHAR(255) ,

  ancho VARCHAR(255) ,

  peso VARCHAR(255) ,

  precio VARCHAR(255) ,

  categoria VARCHAR(255) ,

  publicar INT ,

  despublicar INT ,

  id_categoria_productos INT ,

  PRIMARY KEY (id_productos) ,

  INDEX (id_categoria_productos) ,

  FOREIGN KEY (id_categoria_productos) REFERENCES categoria_productos(id_categoria_productos)

)

TYPE = InnoDB;



CREATE  TABLE categoria1 
(

  id_categoria1 INT NOT NULL ,

  nombre VARCHAR(255) ,

  descripcion VARCHAR(255) ,

  publicar INT ,

  despublicar INT ,

  PRIMARY KEY (id_categoria1) ,

  INDEX (id_categoria_productos) ,

  FOREIGN KEY (id_categoria_productos) REFERENCES categoria_productos(id_categoria_productos)
)

TYPE = InnoDB;



CREATE  TABLE categoria2 
(

  id_categoria2 INT NOT NULL ,

  nombre VARCHAR(255) ,

  descripcion VARCHAR(255) ,

  publicar INT ,

  despublicar INT ,

  PRIMARY KEY (id_categoria2) ,

  INDEX (id_categoria_productos) ,

  FOREIGN KEY (id_categoria_productos) REFERENCES categoria_productos(id_categoria_productos)
)

TYPE = InnoDB;



CREATE  TABLE categoria3 
(

  id_categoria3 INT NOT NULL ,

  nombre VARCHAR(255) ,

  descripcion VARCHAR(255) ,

  publicar INT ,

  despublicar INT ,

  PRIMARY KEY (id_categoria3) ,

  INDEX (id_categoria_productos) ,

  FOREIGN KEY (id_categoria_productos) REFERENCES categoria_productos(id_categoria_productos)
)

TYPE = InnoDB;



CREATE  TABLE usuarios
(

  id_usuarios INT NOT NULL ,
   
  cortesia VARCHAR(255) ,

  nombre VARCHAR(255) ,

  apellidos VARCHAR(255) ,

  nombre_de_usuario VARCHAR(255) ,
  
  contrasena VARCHAR(255) ,

  correo VARCHAR(255) ,

  telefono VARCHAR(255) ,

  telefono_movil VARCHAR(255) ,

  domicilio VARCHAR(255) ,

  localidad VARCHAR(255) ,

  codigo postal INT ,

  sexo VARCHAR(255)  
)

TYPE = InnoDB;
Desde ya muchas gracias de antemano.

P/D: Adjunto una imagen del modelo ER. (es solo ilustrativa ya que use mysql workbench para modelar visualmente y no para exportar el código sql .)

http://www.mediafire.com/i/?5daxieccldsb67v

Última edición por cristian_cena; 30/09/2010 a las 02:46 Razón: Incluyo una imagen del modelo ER
  #2 (permalink)  
Antiguo 30/09/2010, 03:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al crear tablas con claves foraneas en el phpmyadmin

Creo que te estás perdiendo un detalle sobre la implementación de las FK.
Recordemos: Una FOREIGN KEY es un campo o conjunto de campos en una tabla que se referencian a la PRIMARY KEY de otra tabla. Esto significa que debe existir ese campo en la tabla dependiente, y eso es precisamente lo que no estás haciendo, porque el campo id_categoria_productos no existe ni en categoria1, ni en categoria2 ni en categoría3...

Cuando escribes
Código MySQL:
Ver original
  1. FOREIGN KEY (id_categoria_productos)
estás indicando cuál de los campos de la presente tabla es una FK, debe referirse a un campo por su nombre real. Si es otro el nombre no importa en tanto dominio y tipo de datos sean los mismos.

¿Se entiende?

Código MySQL:
Ver original
  1. USE TEST;
  2. CREATE TABLE categoria_productos
  3. (
  4.  id_categoria_productos INT NOT NULL,
  5.  categoria1 INT,
  6.  categoria2 INT,
  7.  categoria3 INT,
  8.  PRIMARY KEY (id_categoria_productos)
  9.  
  10. CREATE TABLE productos (
  11.  id_productos INT NOT NULL,
  12.  codigo VARCHAR(255),
  13.  nombre VARCHAR(255),
  14.  descripcion TEXT,
  15.  imagen VARCHAR(255),
  16.  imagen_miniatura VARCHAR(255),
  17.  imagen_descriptiva VARCHAR(255),
  18.  alto VARCHAR(255),
  19.  ancho VARCHAR(255),
  20.  peso VARCHAR(255),
  21.  precio VARCHAR(255),
  22.  categoria VARCHAR(255),
  23.  publicar INT,
  24.  despublicar INT,
  25.  id_categoria_productos INT,
  26.  PRIMARY KEY (id_productos),
  27.  INDEX (id_categoria_productos),
  28.  FOREIGN KEY (id_categoria_productos) REFERENCES categoria_productos(id_categoria_productos)
  29.  
  30. CREATE TABLE categoria1
  31. (id_categoria1 INT NOT NULL,
  32.  nombre VARCHAR(255),
  33.  descripcion VARCHAR(255),
  34.  publicar INT,
  35.  despublicar INT,
  36.  PRIMARY KEY (id_categoria1),
  37.  FOREIGN KEY (id_categoria1) REFERENCES categoria_productos(id_categoria_productos)
  38.  
  39. CREATE TABLE categoria2
  40. (id_categoria2 INT NOT NULL,
  41.  nombre VARCHAR(255),
  42.  descripcion VARCHAR(255),
  43.  publicar INT,
  44.  despublicar INT,
  45.  PRIMARY KEY (id_categoria2),
  46.  FOREIGN KEY (id_categoria2) REFERENCES categoria_productos(id_categoria_productos)
  47.  
  48.  
  49. CREATE TABLE categoria3
  50. (
  51.  id_categoria3 INT NOT NULL,
  52.  nombre VARCHAR(255),
  53.  descripcion VARCHAR(255),
  54.  publicar INT,
  55.  despublicar INT,
  56.  PRIMARY KEY (id_categoria3),
  57.  FOREIGN KEY (id_categoria3) REFERENCES categoria_productos(id_categoria_productos)
  58.  
  59. CREATE TABLE usuarios
  60. (
  61.  id_usuarios INT NOT NULL PRIMARY KEY,
  62.  cortesia VARCHAR(255),
  63.  nombre VARCHAR(255),
  64.  apellidos VARCHAR(255),
  65.  nombre_de_usuario VARCHAR(255),
  66.  contrasena VARCHAR(255),
  67.  correo VARCHAR(255),
  68.  telefono VARCHAR(255),
  69.  telefono_movil VARCHAR(255),
  70.  domicilio VARCHAR(255),
  71.  localidad VARCHAR(255),
  72.  codigo_postal INT,
  73.  sexo VARCHAR(255)

Tips:
- Estas usando indiscriminadamente VARCHAR de 255 caracteres para campos que jamás usarán semejantes longitudes. Es un desperdicio de disco.
- Pareces estar repitiendo datos entre tablas relacionadas, como nombre, descripción, publicar y despublicar entre las tablas de productos y categorías. No queda claro si se trata de los mismos datos o diferentes. Si al menos uno de ellos es el mismo tendrás problemas de consistencia. Asegurate de eso.
- El modelo completo no parece muy comprensible. Estás trabajando un esquema rígido de categorías, ,y da la impresión que no consideras que un producto pueda tener una sola categoría o tener más de tres. Hay esquemas más flexibles.
- No abuses innecesariamente de los ID numérios. Pueden no ser necesarios. Una tabla como productos_categorías no necesita ID propio porque debería contener solamente la relación entre el producto y la categoría. Si lo analizas correctamente, verás que incluso sólo necesitas una tabla categoría y no tres.
__________________
¿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 30/09/2010, 04:10
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 9 meses
Puntos: 269
Respuesta: Error al crear tablas con claves foraneas en el phpmyadmin

Antes que nada, un millon de gracias gnzsoloyo , tu explicación es excelente y los tips aún mejores!!

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Esto significa que debe existir ese campo en la tabla dependiente, y eso es precisamente lo que no estás haciendo, porque el campo id_categoria_productos no existe ni en categoria1, ni en categoria2 ni en categoría3....
Ops! me olvide de crear los campos!!

Cita:
Iniciado por gnzsoloyo Ver Mensaje
- El modelo completo no parece muy comprensible. Estás trabajando un esquema rígido de categorías, ,y da la impresión que no consideras que un producto pueda tener una sola categoría o tener más de tres. Hay esquemas más flexibles.
Gracias, ahora que lo decís veo que tengo que replantear ese modelo.
Como notarás soy nuevo en mysql, si por ahi tienes a mano un link con ejemplos de esquemas que puedan servirme te lo agradecería.

Etiquetas: claves, phpmyadmin, tablas, foreignkey
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:55.