2008-08-08 16 views
13

मुझे एक सारणी मिली है जो एक विक्रेता से दूसरे विक्रेता को शिपिंग उत्पाद के लिए दिन और लागत ट्रैक करना है। हम (शानदार ढंग से: पी) एक "विक्रेता" तालिका में उत्पाद हैंडलिंग विक्रेताओं (सोचें ... डंडर मिफलिन) के साथ शिपिंग विक्रेताओं (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; 

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


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

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

एक phpinfo कर() बताता है mysql के लिए मुझे इस:

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

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

+0

दरअसल, त्रुटि? 150 एक [विदेशी कुंजी बाधाओं] (http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html) त्रुटि को संदर्भित करता है। क्या आप वेंडर टेबल की परिभाषा प्रदान कर सकते हैं? क्या वेंडर का पीके एक आईएनटी (6) या सिर्फ एक आईएनटी है? उपर्युक्त पृष्ठ से: - * पूर्णांक प्रकारों का आकार और चिह्न समान होना चाहिए। * –

उत्तर

8

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

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; 

विक्रेता प्राथमिक कुंजी होना चाहिए INT (6), और दोनों तालिकाओं प्रकार InnoDB का होना चाहिए।

0

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

0

आप विक्रेता तालिका

मैं इसे समझ से बाहर की परिभाषा प्रदान कर सकते हैं। विक्रेता तालिका MyISAM था ... (मुझे बताने की उन दोनों को InnoDB बनाने के लिए अपने जवाब संपादित;))

(किसी भी कारण से नहीं सिर्फ विक्रेता InnoDB के लिए खत्म हो प्रकार बदलने के)

संबंधित मुद्दे