2013-03-11 14 views
5

मैं MySQL InnoDB में एक टेबल इस तरह बनाया है: तालिका बनाने के दौरान के रूप में के साथ समस्या थीMySQL - नहीं जोड़ सकते हैं विदेशी कुंजी

CREATE TABLE `users` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `type` enum('MANUAL','FACEBOOK') NOT NULL DEFAULT 'MANUAL', 
    `role` enum('COOK','HOST','ALL') NOT NULL DEFAULT 'ALL', 
    `about_me` varchar(1000) DEFAULT NULL, 
    `food_preferences` varchar(1000) DEFAULT NULL, 
    `cooking_experience` varchar(1000) DEFAULT NULL, 
    `with_friend` bit(1) DEFAULT b'0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

अगला मैं इस तरह के एक बयान के साथ एक मेज जोड़ने की कोशिश की (कोई विदेशी कुंजी जोड़ा

0123:

CREATE TABLE `messages` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `from` bigint(20) NOT NULL, 
    `to` bigint(20) NOT NULL, 
    `content` varchar(10000) NOT NULL, 
    `timestamp_sent` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `timestamp_read` timestamp NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

होने टेबल बनाया है, मैं अंत में 'users'.'id' क्षेत्र को संदर्भित 'from' और 'to' खेतों पर विदेशी कुंजी जोड़ने की जरूरत है: कि)

त्रुटि मैं मिलता है:

ERROR: Error 1822: Failed to add the foreign key constraint. Missing index for constraint 'messages_users_fk' in the referenced table 'users'.

लेकिन 'उन' तालिका 'id' पर एक PRIMARY सूचकांक है ...

इसके अलावा एक छोटे कदम बनाने के लिए और सिर्फ 'from' क्षेत्र के लिए विदेशी कुंजी जोड़ने की कोशिश की :

ALTER TABLE `messages` 
    ADD CONSTRAINT `messages_users_fk` 
    FOREIGN KEY (`from`) 
    REFERENCES `users` (`id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE 
, ADD INDEX `messages_users_fk_idx` (`from` ASC) ; 

त्रुटि थोड़ा अलग है:

ERROR: Error 1825: Failed to add the foreign key constraint on table 'messages'. Incorrect options in FOREIGN KEY constraint 'cook4food/messages_users_fk'.

फ़ील्ड के प्रकार समान हैं (bigint(20) NOT NULL) क्योंकि इसे अन्य स्टैक ओवरफ्लो थ्रेड में समस्या का कारण बताया गया था। मेरी टेबल विभाजित नहीं हैं (MySQL मैनुअल इन्हें इनो डीबी में विदेशी कुंजी बाधाओं के लिए सीमा के रूप में बताता है)। 'messages' तालिका वर्तमान में कोई पंक्ति नहीं रखती है, इसलिए संग्रहीत डेटा किसी भी तरह से समस्या नहीं हो सकता है। मैं अटक गया हूँ, कृपया मदद करें।

+1

+1 उनके साथ खेलने के लिए वास्तविक 'CREATE तालिका' कथन देखने के लिए लवली :) –

उत्तर

0

REFERENCES उपयोगकर्ताओं ( आईडी , आईडी )

आपने एक अवैध विदेशी कुंजी (आईडी, आईडी) बनाने के लिए प्रयास कर रहे हैं। एक समग्र सूचकांक (एक से अधिक कॉलम शामिल) में शामिल कॉलम एक ही कॉलम नहीं हो सकते हैं, दोहराया जाता है। कम से कम मैंने कभी यह नहीं देखा है।

दो अलग-अलग विदेशी कुंजी बनाएं, एक से FROM और दूसरे के लिए, प्रत्येक उपयोगकर्ता पर वापस इंगित करता है।

+0

हाँ, मैं इन दो दृष्टिकोणों के बीच अंतर के बारे में सोच रहा था। अलग-अलग विदेशी कुंजी हैं जो मुझे वास्तव में चाहिए। धन्यवाद। –

14

आप उचित विशेषाधिकार हैं, तो आप इस क्वेरी जारी कर सकते हैं:

SHOW ENGINE innodb STATUS 

... जो आप (कुछ अन्य जानकारी के अलावा) बता देंगे त्रुटि का सटीक विवरण:

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
130311 13:30:06 Error in foreign key constraint of table test/#sql-71c_6: 

    FOREIGN KEY (`from` , `to`) 
    REFERENCES `users` (`id` , `id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE 
, ADD INDEX `messages_users_fk_idx` (`from` ASC, `to` ASC): 
You have defined a SET NULL condition though some of the 
columns are defined as NOT NULL. 

माता पिता रिकॉर्ड हटाए जाने पर, आप बच्चे को रिकॉर्ड शून्य नहीं बना सकते क्योंकि कॉलम NOT NULL हैं:

`from` bigint(20) NOT NULL, 
    `to` bigint(20) NOT NULL, 

संपादित करें: इसके अतिरिक्त, मैं एक समग्र कुंजी का उद्देश्य नहीं देख सकता। मुझे लगता है कि आप इसके बजाय दो सिंगल चाबियाँ चाहते हैं।

+1

StackOverflow समुदाय हमेशा सहायक और त्वरित :-)। मैं अब अपनी गलती देख सकता हूं, धन्यवाद! –

+1

कोई विचार अगर 'इंजन इंजन innodb स्थिति' दिखाता है नवीनतम विदेशी कुंजी त्रुटि नहीं दिखाता है? – antonagestam

+0

धन्यवाद यू! +1 अलावरो। तुम मुझे दूसरी रात से बचाओ! एक बार फिर धन्यवाद। –

0

कि हमने देखा है,

आप बच्चे को रिकॉर्ड में सेट शून्य को परिभाषित नहीं कर सकते हैं जब बच्चे कॉलम from और to अशक्त नहीं हैं।

तो यदि आप निम्नलिखित 2 कथनों के साथ विदेशी कुंजी बनाने का प्रयास करते हैं, तो आपके पास messages तालिका में विदेशी कुंजी होनी चाहिए।

1>

ALTER TABLE `messages` ADD CONSTRAINT `messages_users_from_fk` FOREIGN KEY (`from`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, ADD INDEX `messages_users_fk_idx` (`from` ASC) ; 

और

2>

ALTER TABLE `messages` ADD CONSTRAINT `messages_users_to_fk` FOREIGN KEY (`to`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, ADD INDEX `messages_users_fk_to_idx` (`to` ASC) ; 

आशा ये कथन आप मदद करते हैं।

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