2013-08-22 16 views
9

के रूप में एक वर्कर कॉलम के साथ MySQL तालिका मैं वर्चर कॉलम के साथ एक विदेशी तालिका के रूप में एक टेबल बनाने की कोशिश कर रहा हूं लेकिन तालिका बनाने के दौरान MySQL मुझे त्रुटि देता है। मेरे क्वेरी इस तरह है:विदेशी कुंजी

CREATE TABLE network_classes (
    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT, 
    category VARCHAR(80) NOT NULL, 
    PRIMARY KEY(id), 
    KEY `key_1` (`id`,`category`) 
) 
ENGINE=InnoDB; 


CREATE TABLE networks (
    id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100) NOT NULL, 
    category VARCHAR(80) NOT NULL, 
    director_id TINYINT(3) UNSIGNED NULL, 
    director_name VARCHAR(100) NULL, 
    description VARCHAR(1000) NULL, 
    last_modified TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    user_id SMALLINT UNSIGNED NULL, 
    PRIMARY KEY(id), 
    KEY `networks_fk1` (`category`), 
    CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) REFERENCES `network_classes` (`category`) ON DELETE NO ACTION, 
    INDEX networks_index2471(name), 
    INDEX networks_index2472(director_id, director_name) 
) 
ENGINE=InnoDB; 

और मैं इस त्रुटि मिलती है:

[Err] 1215 - Cannot add foreign key constraint 

मैं MySQL 5.6.12 उपयोग कर रहा हूँ। इसे ठीक करने के लिए मैं अपनी क्वेरी को फिर से लिख सकता हूं?

उत्तर

16

आपके पास केवल एक अद्वितीय क्षेत्र का संदर्भ देने वाली एक विदेशी कुंजी हो सकती है। जैसे

नीचे
CREATE TABLE network_classes (
    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT, 
    category VARCHAR(80) NOT NULL, 
    PRIMARY KEY(id), 
    UNIQUE KEY `category_UNIQUE` (`category`), 
    KEY `key_1` (`id`,`category`) 
) 
ENGINE=InnoDB; 


CREATE TABLE networks (
    id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100) NOT NULL, 
    category VARCHAR(80) NOT NULL, 
    director_id TINYINT(3) UNSIGNED NULL, 
    director_name VARCHAR(100) NULL, 
    description VARCHAR(1000) NULL, 
    last_modified TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    user_id SMALLINT UNSIGNED NULL, 
    PRIMARY KEY(id), 
    KEY `networks_fk1` (`category`), 
    CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) REFERENCES `network_classes` (`category`) ON DELETE NO ACTION, 
    INDEX networks_index2471(name), 
    INDEX networks_index2472(director_id, director_name) 
) 
ENGINE=InnoDB; 

फिर आप आप चाहते हैं

0

CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) 
REFERENCES `network_classess` (`category`) ON DELETE NO ACTION, 

में

आप, network_classess बजाय network_classes का इस्तेमाल किया है (अपने बनाने तालिका स्क्रिप्ट के रूप में) ताकि तालिका मौजूद नहीं।

संपादित अपने बाधा के

नाम कुंजी (networks_fk1) परिवर्तन लोगों की ही है।

मैंने आपके डीडीएल को बेहतर पढ़ा।

आपकी तालिका नेटवर्क_क्लास के पास प्राथमिक कुंजी आईडी है, इसलिए सही है कि विदेशी आईडी को आपके आईडी फ़ील्ड को जोड़ने के लिए फ़ील्ड सही है, श्रेणी फ़ील्ड आपके टेबल नेटवर्क में दिखाई नहीं देनी चाहिए, लेकिन मुझे लगता है कि आपको fk_network_class (int के रूप में रखना होगा)) आईडी से जुड़े (network_classes)

+0

विदेशी कुंजी मैं यह सही जोड़ने के लिए सक्षम होना चाहिए अपने network_classes तालिका को संशोधित करें ताकि श्रेणी क्षेत्र में अनूठा है, लेकिन अभी भी एक ही मुद्दा है –

+0

आपका network_classess रिक्त है ? एक और बात, यदि आप एक समग्र प्राथमिक कुंजी को परिभाषित करते हैं, तो विदेशी कुंजी बराबर होनी चाहिए (यह आपकी त्रुटि पर प्रभाव नहीं डालती है) –

+0

हां, यह है। क्या आप कृपया अपनी तरफ से क्वेरी चला सकते हैं? मैं सैद्धांतिक कल्पनाओं के बजाय व्यावहारिक समाधान की तलाश में हूं। –

5

column types in the table and the referenced table do not match for constraint

क्यों एक ही आकार के साथ 2 वर्कर कॉलम प्रकार से मेल नहीं खाते हैं? और निश्चित रूप से जवाब स्पष्ट संयोजन है। यह बताता है कि नई तालिका में कॉलम ASCII के बजाय संदर्भित तालिका में यूटीएफ -8 था। Ascii में बदल दिया और किया।

+0

वे दोनों एक ही प्रकार (डिफ़ॉल्ट प्रकार) का उपयोग कर रहे हैं। ऐसा आप कैसे कह सकते हैं!!?? –

+0

उल्लेख करने लायक भी है, सुनिश्चित करें कि वे दोनों InnoDB टेबल –

1

FOREIGN KEY बाधा का लक्ष्य अनुक्रमित करने की आवश्यकता है। आमतौर पर, यह PRIMARY KEY है इसलिए यह कोई मुद्दा नहीं है, लेकिन आपके मामले में यह नहीं है (हालांकि यह एक समग्र कुंजी का हिस्सा है, यह पर्याप्त नहीं है)

अपने network_classes पर एक अनुक्रमणिका बनाएं। category क्षेत्र:

CREATE INDEX category_idx ON network_classes(category); 

फिर अपने networks तालिका दोबारा बनाना होगा।

+0

बहुत धन्यवाद जेरेमी। मैंने इंडेक्स बनाया और इसे हल किया। –

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