Mai multe chei străine?

Am o masă care ar trebui să urmărească zilele și costurile pentru expedierea produsului de la un furnizor la altul. Noi (strălucit: p) am păstrat atât vânzătorii de marfă (FedEx, UPS), cât și furnizorii de manipulare a produselor (Think ... Dunder Mifflin) într-o masă "VANDTOR". Deci, am trei coloane în tabelul meu SHIPPING_DETAILS pe ​​care toate referințele VENDOR.no. Din anumite motive, MySQL nu mă lasă să le definesc pe toate trei ca chei străine. Vreo idee?

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;

Editat pentru a elimina definiția dublă a cheii primare ...


Da, din păcate, asta nu a rezolvat-o. Acum primesc:

Nu se poate crea tabel   './REMOVAT NUMELE MY DB /SHIPPING_GRID.frm'   (errno: 150)

Făcând un phpinfo() îmi spune asta pentru mysql:

Versiunea API a clientului 5.0.45

Da, VENDOR.no este tipul int (6).

0
fr hi bn
Într-adevăr, eroarea 150 se referă la constrângerile cheie cheie străine eroare. Puteți furniza definiția tabelului VÂNZĂTOR? Este PK al vânzătorului un INT (6) sau doar un INT? Din pagina de mai sus: - Dimensiunea și semnul tipurilor întregi trebuie să fie identice.
adăugat autor Christian Lescuyer, sursa

3 răspunsuri

Puteți să furnizați definiția   VENDOR tabel

Mi-am dat seama. Tabelul VANZATORI a fost MyISAM ... (editat răspunsul dvs. pentru a-mi spune să le fac ambele INNODB;))

(orice motiv nu pentru a comuta doar tipul de VANDOR la ​​INNODB?)

0
adăugat

Am rulat codul aici și mesajul de eroare a arătat (și este drept!) Că setați câmpul id de două ori ca cheie primară.

0
adăugat

Ați definit de două ori cheia primară. Încerca:

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;

Cheia primară VENDOR trebuie să fie INT (6), iar ambele tabele trebuie să fie de tip InnoDB.

0
adăugat
MySQL - comunitatea Română
MySQL - comunitatea Română
19 participanți

Comunitatea română a programatorilor MySQL.