Pregunta

Tengo una tabla que se supone debe realizar un seguimiento de los días y los costos de envío del producto de un proveedor a otro.Nosotros (brillantemente :p) almacenamos tanto a los proveedores de envío (FedEx, UPS) como a los proveedores de manipulación de productos (piense...Dunder Mifflin) en una tabla "VENDEDOR".Entonces, tengo tres columnas en mi tabla SHIPPING_DETAILS que hacen referencia a VENDOR.no.Por alguna razón, MySQL no me permite definir las tres como claves externas.¿Algunas ideas?

CREATE TABLE SHIPPING_GRID(  
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique ID for each row',  
    shipping_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the shipping vendor (vendors_type must be 3)',  
    start_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the vendor being shipped from',  
    end_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to the VENDOR.no for the vendor being shipped to',  
    shipment_duration INT(1) DEFAULT 1 COMMENT 'Duration in whole days shipment will take',  
    price FLOAT(5,5) NOT NULL COMMENT 'Price in US dollars per shipment lbs (down to 5 decimal places)',  
    is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 if is flat rate regardless of weight, 0 if price is by lbs',  
    INDEX (shipping_vendor_no),  
    INDEX (start_vendor_no),  
    INDEX (end_vendor_no),  
    FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)  
) TYPE = INNODB;

Editado para eliminar la definición de doble clave primaria...


Sí, desafortunadamente eso no solucionó el problema.Ahora estoy obteniendo:

No puedo crear tabla './ELIMINADO MI NOMBRE DE BD/Shipping_grid.frm '(errno:150)

Hacer un phpinfo() me dice esto para mysql:

API de cliente versión 5.0.45

Sí, VENDOR.no es de tipo int(6).

¿Fue útil?

Solución

Definiste la clave principal dos veces.Intentar:

CREATE TABLE SHIPPING_GRID(  
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique ID for each row',  
    shipping_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the shipping vendor (vendors_type must be 3)',  
    start_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the vendor being shipped from',  
    end_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to the VENDOR.no for the vendor being shipped to',  
    shipment_duration INT(1) DEFAULT 1 COMMENT 'Duration in whole days shipment will take',  
    price FLOAT(5,5) NOT NULL COMMENT 'Price in US dollars per shipment lbs (down to 5 decimal places)',  
    is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 if is flat rate regardless of weight, 0 if price is by lbs',  
    INDEX (shipping_vendor_no),  
    INDEX (start_vendor_no),  
    INDEX (end_vendor_no),  
    FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)  
) TYPE = INNODB;

La clave principal del VENDEDOR debe ser INT(6) y ambas tablas deben ser del tipo InnoDB.

Otros consejos

Ejecuté el código aquí y el mensaje de error mostró (¡y es correcto!) que estás configurando identificación campo dos veces como clave principal.

¿Puede proporcionar la definición de la tabla de proveedores?

Me lo imaginé.La tabla VENDOR era MyISAM...(editaste tu respuesta para decirme que los haga ambos INNODB;))

(cualquier razón no simplemente cambiar el tipo de VENDEDOR a INNODB?)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top