2011-08-10 17 views
18

मैं कॉलम युक्त तालिका CustomizationSet है:मौजूदा तालिका में विदेशी कुंजी जोड़ना त्रुटि देता है 1050 तालिका पहले से मौजूद है

customization_set_guid (which is a non-nullable guid and also the primary key) 
creator_account_guid 
and a few others 

और कॉलम के साथ मौजूदा डेटा पंजीकरण के साथ एक मेज:

registration_id (an int and the primary key) 
customization_set_guid (also a guid (so a char(36)) which is nullable, and all entries are currently null) 
and a few other columns 

जब मैं कोशिश करते हैं और

ALTER TABLE Registration ADD FOREIGN KEY 
    (
     customization_set_guid 
    ) REFERENCES CustomizationSet (
     customization_set_guid 
    ); 
MySQL Workbench में

चलाने के लिए, यह त्रुटि 1050Table '। \ dbname \ registra देता है टियन 'पहले से मौजूद है।

यदि मैं बाहरी तालिका डायलॉग के विदेशी कुंजी टैब के साथ विदेशी कुंजी जोड़ने के लिए यूआई का उपयोग करने का प्रयास करता हूं, और संदर्भित तालिका के रूप में अनुकूलनसेट को चुनता हूं, तो यह मुझे कॉलम की सूची में customization_set_guid चुनने नहीं देता है।

मुझे सच में यकीन नहीं है कि यह मुझे इस विदेशी कुंजी को जोड़ने क्यों नहीं देगा। मैंने अभी हाल ही में जोड़े गए तालिकाओं के बीच सफलतापूर्वक विदेशी कुंजी बनाई हैं। पंजीकरण तालिका कुछ समय के लिए ही अस्तित्व में है ...

उत्तर

2

तो एक टीम के सदस्य ने इसे समझ लिया। एक तालिका को utf8_general प्रकार के साथ सेट किया गया था, और दूसरा प्रकार डिफ़ॉल्ट पर सेट किया गया था। मुझे नहीं लगता था कि यह एक मुद्दा था, क्योंकि डिफ़ॉल्ट utf8_general है, लेकिन स्पष्ट रूप से mysql केवल प्रकार के नामों को देखता है, न कि अंतर्निहित प्रकार।

0

मुझे यकीन है कि अगर यह एक टाइपो है नहीं कर रहा हूँ, लेकिन नहीं होना चाहिए

ALTER TABLE Registration ADD FOREIGN KEY 
(
    customization_set_guid 
) REFERENCES CustomizationSet (
    customization_set_guid 
); 

तालिका के बारे में सुनिश्चित नहीं हैं कि जैसे

ALTER TABLE Registration ADD FOREIGN KEY 
customization_set_guid_fk (customization_set_guid) 
REFERENCES CustomizationSet (customization_set_guid); 
+0

एक ही त्रुटि देता है। मुझे लगता है कि वाक्य रचना के साथ बना लिया है अन्य टेबल पर अन्य विदेशी कुंजी काम किया है, यह बस कुंजी के लिए एक डिफ़ॉल्ट नाम जोड़ता है। – avaleske

+0

हम्म। ऐसा लगता है कि इसमें '1050 टेबल' करने के लिए कुछ है। \ dbname \ registration'' और विदेशी कुंजी नहीं। क्या किसी अन्य तालिका में एक और विदेशी कुंजी जोड़ना ठीक काम करता है? – ace

0

कुछ हो पहले से मौजूद है, लेकिन कारण यह है कि आप जिस कॉलम को चाहते हैं उसे चुनने की वजह से कॉलम के कारण एक ही प्रकार का नहीं होना चाहिए। यह सुनिश्चित करने के लिए जांचें कि वे एक ही प्रकार, समान लंबाई दोनों हैं, और सभी समान विकल्प हैं।

+0

वे दोनों char (36) हैं, लेकिन रजिस्ट्रेशन में से एक हैं राशन शून्य है। क्या उससे कोई अंतर पड़ेगा? – avaleske

8

मुझे एक ही त्रुटि मिली, और यह इस तथ्य के कारण था कि विदेशी कुंजी पहले से मौजूद है।

ALTER TABLE Registration 
    ADD CONSTRAINT idx_Registration_CustomizationSet 
    FOREIGN KEY (customization_set_guid) 
    REFERENCES CustomizationSet(customization_set_guid); 
+2

आपको नहीं करना है। मेरी समस्या यह थी कि मैंने कुछ पढ़ा और करने के बाद मुझे एहसास हुआ कि मैं पहले से ही मौजूदा बाधा को जोड़ने की कोशिश कर रहा था। बाधा को हटाने से MySQL एक नाम स्वयं असाइन करता है। यह http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html से है: "यदि CONSTRAINT प्रतीक खंड दिया गया है, तो प्रतीक मान डेटाबेस में अद्वितीय होना चाहिए। यदि खंड नहीं दिया गया है, तो InnoDB स्वचालित रूप से नाम बनाता है। " – Nicsoft

+1

यह वास्तव में मेरे लिए काम किया। स्पष्ट रूप से बाधा देना एक नाम काम किया। अजीब, क्योंकि इस तालिका में कोई मौजूदा बाधा नहीं थी। – Richard

+0

जब मैंने बाधा के लिए नाम निर्दिष्ट किया तो मेरे लिए काम किया। यह एक और मौजूदा बाधा के साथ संघर्ष कर रहा होगा। – Magicode

2

ऐसा लगता है कि MySQL पर इस बात के लिए एक बग रिपोर्ट यहाँ स्थित है की तरह: क्या आप चाहते हैं बस बाधा जोड़ने के लिए है

MySQL Bug 55296

अंत में, मुझे लगता है कि उन्हें अपग्रेड उनके सर्वर और यह मुद्दा तय किया। इसे पढ़ने से, मुझे यकीन नहीं है हालांकि। उनके पास कुछ कामकाज थे जैसे कि बाधाओं के नाम/उन्हें बदलना। यदि आपको लगता है कि यह वही है, तो मैं अनुरोध करता हूं कि बग फिर से खोला जाए।

एक बिंदु पर, वे उल्लेख करते हैं कि प्रकार मेल नहीं खाते हैं और वर्कबेंच गलत त्रुटि के साथ प्रतिक्रिया दे रहा था (यह एक त्रुटि 150 या गलत 121 होना चाहिए)। आप यहां उन त्रुटियों के कारण देख सकते हैं: MySQL Foreign Key Errors and Errno 150

1

मुझे एक ही त्रुटि मिली, और चूंकि मेरे मामले का अभी तक उल्लेख नहीं किया गया था, इसलिए मैं यह उत्तर पोस्ट करूंगा और उम्मीद है कि यह किसी के समय को बचा सकता है!

मेरे दो टेबल इंजन, जहां अलग हैं। एक InnoDB था, और दूसरा MyIsam।

एक मेज के इंजन बदलने के लिए:

तालिका चुनें, टेबल बदल मारा, और फिर पर कि दोहरे तीर हिट करने के लिए सबसे-दाएं Workbench की (इसलिए यह ऊपर की ओर इंगित करेगा)।

अब इंजन बदलें!

1
  • CustomizationSet तालिका के लिए भंडारण इंजन के प्रकार की जाँच करें।

मैं एक ही समस्या थी, लेकिन मैं, InnoDB के लिए इंजन प्रकार बदल कर इसे हल कर सकता है क्योंकि कुछ प्रकार के विदेशी कुंजी की कमी का समर्थन नहीं करते।

0

मुझे एक ही समस्या थी और अंत में यह ईमानदारी बाधा की समस्या थी। विदेशी कुंजी कॉलम एक विदेशी कॉलम का संदर्भ दे रहा था जिसने मौजूद नहीं था।

परीक्षण करने के लिए पूरे मामले की जानकारी निम्नलिखित चलाने का प्रयास करें:

select r.customization_set_guid, c.customization_set_guid 
from Registration r 
right join CustomizationSet c 
on 
r.customization_set_guid = c.customization_set_guid 
where isnull(c.customization_set_guid); 
0

जब MysqlWorkbench त्रुटि का उपयोग कर भ्रामक है। मेरा मुद्दा यह था कि मैं उस टेबल पर एक विदेशी कुंजी बाधा जोड़ने की कोशिश कर रहा था जिसमें पहले से पंक्तियां थीं और पंक्तियों में से एक खाली थी (एफके बाधा को पूरा नहीं किया। शिकायत करने के बजाय उस बाधा लागू होने पर विफल हो जाएगी, MySQLWorkbench ने बताया कि तालिका मौजूद है।

हमलावर पंक्ति तय निकाला जा रहा है (या जोड़ने और क्षेत्र के लिए स्वीकार्य मूल्य में रोके) समस्या हल हो।

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