एकाधिक विदेशी कुंजी?

मेरे पास एक टेबल है जो शिपिंग विक्रेता के लिए दिन और लागत को एक विक्रेता से दूसरे में ट्रैक करना है। हम (शानदार ढंग से: पी) एक "विक्रेता" तालिका में उत्पाद हैंडलिंग विक्रेताओं (सोचें ... डंडर मिफलिन) के साथ शिपिंग विक्रेताओं (FedEx, UPS) दोनों को संग्रहीत किया। इसलिए, मेरे पास SHIPPING_DETAILS तालिका में तीन कॉलम हैं जो सभी संदर्भ VENDOR.no हैं। किसी कारण से MySQL मुझे तीनों को विदेशी कुंजी के रूप में परिभाषित नहीं करने दे रहा है। कोई विचार?

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;

डबल प्राथमिक कुंजी परिभाषा को हटाने के लिए संपादित ...


हाँ, दुर्भाग्य से हालांकि इसे ठीक नहीं किया। अब मुझे मिल रहा है:

तालिका नहीं बना सकता है   './REDOVED मेरा डीबी नाम /SHIPPING_GRID.frm'   (errno: 150)

Phpinfo() करना मुझे MySQL के लिए यह बताता है:

क्लाइंट API संस्करण 5.0.45

हां, VENDOR.no प्रकार int (6) है।

0
ro fr bn
दरअसल, त्रुटि 150 एक विदेशी कुंजी बाधाओं को संदर्भित करता है त्रुटि। क्या आप वेंडर टेबल की परिभाषा प्रदान कर सकते हैं? क्या वेंडर का पीके एक आईएनटी (6) या सिर्फ एक आईएनटी है? उपर्युक्त पृष्ठ से: - पूर्णांक प्रकारों का आकार और चिह्न समान होना चाहिए।
जोड़ा लेखक Christian Lescuyer, स्रोत

3 उत्तर

क्या आप की परिभाषा प्रदान कर सकते हैं   वेंडर टेबल

मैं यह समझ गया। वेंडर टेबल माईसाम था ... (मुझे जवाब देने के लिए मुझे जवाब दें कि उन्हें दोनों INNODB बनाने के लिए;))

(किसी भी कारण नहीं को केवल VENDOR प्रकार को INNODB पर स्विच करने के लिए?)

0
जोड़ा

मैंने यहां कोड चलाया, और त्रुटि संदेश दिखाया गया (और यह सही है!) कि आप प्राथमिक कुंजी के रूप में id फ़ील्ड को दो बार सेट कर रहे हैं।

0
जोड़ा

आपने प्राथमिक कुंजी को दो बार परिभाषित किया है। प्रयत्न:

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;

VENDOR प्राथमिक कुंजी INT (6) होना चाहिए, और दोनों सारणी InnoDB प्रकार का होना चाहिए।

0
जोड़ा