Domanda

Ho una tabella che dovrebbe tenere traccia dei giorni e dei costi per la spedizione del prodotto da un fornitore a un altro.Abbiamo (brillantemente :p) memorizzato sia i fornitori di spedizioni (FedEx, UPS) che i fornitori di movimentazione dei prodotti (Think...Dunder Mifflin) in una tabella "VENDOR".Quindi, ho tre colonne nella mia tabella SHIPPING_DETAILS che fanno tutte riferimento a VENDOR.no.Per qualche motivo MySQL non mi permette di definirli tutti e tre come chiavi esterne.Qualche idea?

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;

Modificato per rimuovere la definizione della doppia chiave primaria...


Sì, sfortunatamente però questo non ha risolto il problema.Ora ricevo:

Impossibile creare la tabella './RIMOSSO IL MIO NOME DB/Shipping_grid.frm '(errno:150)

Fare un phpinfo() mi dice questo per mysql:

Versione API client 5.0.45

Sì, VENDOR.no è di tipo int(6).

È stato utile?

Soluzione

Hai definito la chiave primaria due volte.Tentativo:

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 chiave primaria VENDOR deve essere INT(6) ed entrambe le tabelle devono essere di tipo InnoDB.

Altri suggerimenti

Ho eseguito il codice qui e il messaggio di errore mostrava (ed è giusto!) quello che stai impostando id campo due volte come chiave primaria.

Puoi fornire la definizione della tabella dei fornitori

L'avevo capito.La tabella VENDOR era MyISAM...(modifica la tua risposta per dirmi di renderli entrambi INNODB;))

(qualche ragione non per cambiare semplicemente il tipo VENDOR in INNODB?)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top