2008-08-08 20 views
13

Tengo una tabla que se supone que rastrea los días y los costos para el envío de productos de un proveedor a otro. Nosotros (brillantemente: p) almacenamos tanto a los proveedores de envío (FedEx, UPS) como a los proveedores de manejo de productos (Think ... Dunder Mifflin) en una mesa "VENDOR". Por lo tanto, tengo tres columnas en mi tabla SHIPPING_DETAILS que hacen referencia a VENDOR.no. Por algún motivo, MySQL no me permite definir las tres claves foráneas. ¿Algunas ideas?¿Llaves extranjeras múltiples?

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 el doble definición de la clave primaria ...


Sí, por desgracia, que no ha solucionado el problema sin embargo. Ahora me estoy haciendo:

No se puede crear la tabla './ quité DB NOMBRE /SHIPPING_GRID.frm' (Error: 150)

Haciendo un phpinfo() le dice mí esto para MySQL:

versión de la API de cliente 5.0.45

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

+0

De hecho, el error? 150 hace referencia a un error de [restricciones de clave externa] (http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html). ¿Puedes proporcionar la definición de la tabla de VENDEDORES? ¿El PK de VENDOR es INT (6) o solo INT? Desde la página anterior: - * El tamaño y el signo de los tipos enteros deben ser iguales. * –

Respuesta

8

Ha definido la clave principal dos veces. Proveedores: clave principal

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; 

el vendedor debe ser INT (6), y las dos tablas debe ser de tipo InnoDB.

0

Ejecuto el código aquí, y el mensaje de error mostró (¡y es correcto!) Que está configurando el campo id dos veces como clave principal.

0

¿Puede dar la definición de la tabla PROVEEDOR

lo he descubierto. La tabla de proveedores era MyISAM ... (editado su respuesta a decirme para que sean tanto INNODB;))

(cualquier razón no para cambiar simplemente escriba el PROVEEDOR a INNODB)