Ver Mensaje Individual
  #2 (permalink)  
Antiguo 30/09/2010, 03:09
Avatar de gnzsoloyo
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 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)