2008-08-08 33 views
13

Tôi có một bảng được cho là theo dõi ngày và chi phí vận chuyển sản phẩm từ nhà cung cấp này sang nhà cung cấp khác. Chúng tôi (rực rỡ: p) lưu trữ cả các nhà cung cấp vận chuyển (FedEx, UPS) với các nhà cung cấp xử lý sản phẩm (Hãy suy nghĩ ... Dunder Mifflin) trong bảng "VENDOR". Vì vậy, tôi có ba cột trong bảng SHIPPING_DETAILS của tôi rằng tất cả tham chiếu VENDOR.no. Vì một lý do nào đó, MySQL không cho phép tôi định nghĩa cả ba là khóa ngoài. Bất kỳ ý tưởng?Nhiều khóa ngoại?

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 để loại bỏ đôi nét khóa chính ...


Yeah, may mà không khắc phục được nó mặc dù. Bây giờ tôi nhận được:

Không thể tạo bảng './ REMOVED MY DB TÊN /SHIPPING_GRID.frm' (errno: 150)

Làm một phpinfo() cho tôi đây cho mysql:

khách hàng phiên bản API 5.0.45

Có, VENDOR.no là kiểu int (6).

+0

Thật vậy, lỗi? 150 đề cập đến một lỗi [ràng buộc khoá ngoại] (http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html). Bạn có thể cung cấp định nghĩa của bảng VENDOR không? PK của VENDOR là INT (6) hay chỉ là INT? Từ trang trên: - * Kích thước và ký hiệu của các loại số nguyên phải giống nhau. * –

Trả lời

8

Bạn đã xác định khóa chính hai lần. Hãy thử:

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; 

Khóa chính của VENDOR phải là INT (6) và cả hai bảng phải thuộc loại InnoDB.

0

Tôi đã chạy mã ở đây và thông báo lỗi hiển thị (và nó đúng!) Mà bạn đang thiết lập trường id hai lần làm khóa chính.

0

Bạn có thể cung cấp các định nghĩa của bảng VENDOR

I figured it out. Bảng VENDOR là MyISAM ... (sửa câu trả lời của bạn cho tôi biết để làm cho họ cả InnoDB;))

(bất kỳ lý do không chỉ switch Bên Bán gõ trên để InnoDB)

Các vấn đề liên quan