2008-08-08 13 views
13

Mam tabelę, która ma śledzić dni i koszty wysyłki produktu od jednego dostawcy do drugiego. My (znakomicie: p) przechowywaliśmy zarówno sprzedawców (FedEx, UPS), jak i sprzedawców produktów (pomyśl ... Dunder Mifflin) w tabeli "VENDOR". Mam więc trzy kolumny w mojej tabeli SHIPPING_DETAILS, które wszystkie odnoszą się do VENDOR.no. Z jakiegoś powodu MySQL nie pozwala mi zdefiniować wszystkich trzech kluczy obcych. Jakieś pomysły?Wiele kluczy obcych?

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; 

Edited by usunąć podwójne definicję klucza podstawowego ...


Tak, niestety, że nie rozwiąże to mimo. Teraz dostaję:

Nie można utworzyć tabelę './ zdjąłem NAZWA DB /SHIPPING_GRID.frm' (errno: 150)

robi phpinfo() mówi mnie to dla MySQL:

API Client wersja 5.0.45

Tak, VENDOR.no to typ int (6).

+0

Rzeczywiście błąd? 150 odnosi się do błędu [obcego klucza ograniczenia] (http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html) błędu. Czy umiesz podać definicję tabeli VENDOR? Czy PK of VENDOR jest INT (6) czy tylko INT? Z powyższej strony: - * Rozmiar i znak liczb całkowitych muszą być takie same. * –

Odpowiedz

8

Zdefiniowałeś klucz podstawowy dwa razy. Wypróbuj:

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; 

Klucz podstawowy VENDOR musi być INT (6), a obie tabele muszą być typu InnoDB.

0

Przepuściłem tutaj kod, a komunikat o błędzie pokazał (i dobrze!), Że ustawiasz id pole dwa razy jako klucz podstawowy.

0

można podać definicję tabeli VENDOR

I zdobione. W tabeli dostawców było MyISAM ... (edytowane odpowiedź mi powiedzieć, aby ich obu InnoDB;))

(każdy powód nie tylko przełącznik sprzedawca wpisać nad do InnoDB)