2012-01-26 15 views
92

मैंने इंटरनेट पर इस समस्या का समाधान खोजा और SO प्रश्नों की जांच की लेकिन मेरे मामले के लिए कोई समाधान नहीं हुआ।त्रुटि कोड: 1005. तालिका '...' नहीं बना सकता (त्रुटि: 150)

मैं टेबल sira_no से metal_kod तक एक विदेशी कुंजी बनाना चाहता हूं।

ALTER TABLE sira_no 
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU) 
    REFERENCES metal_kod(METAL_KODU) 
    ON DELETE SET NULL 
    ON UPDATE SET NULL ; 

यह स्क्रिप्ट रिटर्न:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150) 

मैं संदर्भित तालिका में सूचकांक जोड़ने की कोशिश की:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU); 

मैं दोनों तालिकाओं (चारसेट और मिलान) पर METAL_KODU जाँच की। लेकिन इस समस्या का समाधान नहीं मिला। क्या किसी को कोई ख़याल है? अग्रिम में धन्यवाद।

संपादित करें:

METAL_KODU varchar(4) NO PRI  
DURUM bit(1) NO   
METAL_ISMI varchar(30) NO   
AYAR_YOGUNLUK smallint(6) YES  100 
+0

आप 'metal_kod' तालिका के लिए स्कीमा ... दिखा सकते हैं कि तालिका में जो क्षेत्र होना चाहिए विदेशी कुंजी संदर्भ? उत्तर के लिए – ManseUK

उत्तर

239

त्रुटि कोड:: 1005 - वहाँ एक संदर्भ FK क्षेत्र मौजूद नहीं होने के कारण अपने कोड में एक गलत प्राथमिक कुंजी संदर्भ

आमतौर पर यह है यहाँ metal_kod टेबल है। हो सकता है कि आपके पास टाइपो गलती हो, या केस की जांच करें, यह एक जैसा होना चाहिए, या फ़ील्ड-प्रकार मेल नहीं है। एफके-जुड़े फ़ील्ड को परिभाषाओं से बिल्कुल मेल खाना चाहिए।

कुछ ज्ञात कारणों में हो सकता है:

  1. दो प्रमुख क्षेत्रों टाइप और/या आकार बिल्कुल मेल नहीं खाता। उदाहरण के लिए, यदि कोई INT(10) है तो मुख्य फ़ील्ड को INT(10) होना चाहिए और INT(11) या TINYINT नहीं होना चाहिए। आप SHOWCREATETABLE का उपयोग करके फ़ील्ड आकार की पुष्टि करना चाह सकते हैं क्योंकि क्वेरी ब्राउज़र कभी-कभी दोनों और INT(11) के लिए दृश्यमान रूप से दिखाएगा। आपको यह भी जांचना चाहिए कि SIGNED नहीं है और दूसरा UNSIGNED है। वे दोनों बिल्कुल वही होना चाहिए।
  2. उस मुख्य क्षेत्र में से एक जिसे आप संदर्भित करने का प्रयास कर रहे हैं, में कोई अनुक्रमणिका नहीं है और/या प्राथमिक कुंजी नहीं है। यदि रिलेशनशिप में से कोई फ़ील्ड प्राथमिक कुंजी नहीं है, तो आपको उस फ़ील्ड के लिए एक इंडेक्स बनाना होगा।
  3. विदेशी कुंजी नाम पहले से मौजूद कुंजी का डुप्लिकेट है। जांचें कि आपकी विदेशी कुंजी का नाम आपके डेटाबेस में अद्वितीय है। इसके लिए परीक्षण करने के लिए बस अपने कुंजी नाम के अंत में कुछ यादृच्छिक वर्ण जोड़ें।
  4. आपकी एक या दोनों टेबल MyISAM तालिका है। विदेशी कुंजी का उपयोग करने के लिए, टेबल दोनों InnoDB होना चाहिए। (असल में, यदि दोनों टेबल MyISAM हैं तो आपको एक त्रुटि संदेश नहीं मिलेगा - यह केवल कुंजी नहीं बनाएगा।) क्वेरी ब्राउज़र में, आप तालिका प्रकार निर्दिष्ट कर सकते हैं।
  5. आप एक झरना ONDELETESETNULL निर्दिष्ट किया है, लेकिन प्रासंगिक प्रमुख क्षेत्र NOTNULL को तैयार है। आप इसे NULL मानों को अनुमति देने के लिए या तो अपना कैस्केड बदलकर या फ़ील्ड सेट करके इसे ठीक कर सकते हैं।
  6. सुनिश्चित करें कि वर्णमाला और कोलेट विकल्प तालिका स्तर पर और कुंजी स्तंभों के लिए व्यक्तिगत फ़ील्ड स्तर दोनों पर समान हैं।
  7. आपके पास अपने विदेशी कुंजी कॉलम पर एक डिफ़ॉल्ट मान (यानी डिफ़ॉल्ट = 0) है
  8. संबंधों में से एक क्षेत्र संयोजन (समग्र) कुंजी का हिस्सा है और इसकी अपनी व्यक्तिगत अनुक्रमणिका नहीं है। यद्यपि क्षेत्र में समग्र कुंजी के हिस्से के रूप में एक अनुक्रमणिका है, फिर भी आपको उस कुंजी फ़ील्ड के लिए एक बाधा में उपयोग करने के लिए एक अलग अनुक्रमणिका बनाना होगा।
  9. आप अपने ALTER बयान में एक सिंटैक्स त्रुटि है या आप संबंध
  10. अपने विदेशी कुंजी का नाम 64 वर्ण की अधिकतम सीमा को पार कर में क्षेत्र नामों में से एक गलत लिख दिया।
अधिक जानकारी के लिए

देखें: MySQL Error Number 1005 Can’t create table

+0

धन्यवाद। जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मैंने पहले से ही आपके अधिकांश सुझावों की जांच की है। मैं दूसरों को भी कोशिश करूंगा। – lamostreta

+4

समस्या यह थी कि विदेशी कुंजी वर्णमाला मेल नहीं खा रहे थे। जवाब के लिए धन्यवाद। – lamostreta

+4

[इस सवाल] में वर्णित 'इंजन इंजन INNODB स्थिति' दिखाएं (http://stackoverflow.com/questions/2799021/mysql-error-1005-hy000-cant-create-table-foo-sql-12c-4-errno -150) ने मुझे अपनी विशेष समस्या का निदान करने में मदद की (पीईबीसीएक, मेरे मामले में ...) – Hobo

3

अक्सर यह होता है विदेशी कुंजी और संदर्भ कुंजी एक ही प्रकार या एक ही लंबाई

+0

इस के लिए धन्यवाद! मुझे कुछ मिनट बचाया। –

3

मैं जानता हूँ कि इस छोटे से देर से जवाब है, लेकिन नहीं है जब मैंने सोचा कि यह किसी के लिए सहायक हो सकता है।

कभी-कभी मास्टर टेबल को छोड़ दिया जाता है (शायद विदेशी_की_चेक को अक्षम करके) लेकिन विदेशी कुंजी कन्स्ट्रेंट अभी भी अन्य तालिकाओं में मौजूद है। मेरे मामले में मैंने टेबल छोड़ दिया था और इसे फिर से बनाने की कोशिश की लेकिन यह मेरे लिए एक ही त्रुटि फेंक रहा था।

तो सभी तालिकाओं से सभी विदेशी कुंजी CONSTRAINT को छोड़ने का प्रयास करें यदि कोई है और फिर तालिका को अपडेट या बनाएं।

1

यह क्योंकि तालिका के नाम बाधा घोषणा में संदर्भित किया जा रहा मेरे मामले में हुआ सही नहीं है (मैं तालिका नाम में अपर केस भूल गया)

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

मुझे आशा है कि मदद करता है।

11

यह तब भी हो सकता है जब आपके डेटाबेस को एक सर्वर से दूसरे सर्वर पर निर्यात किया जा सके और तालिका डिफ़ॉल्ट रूप से वर्णानुक्रम में सूचीबद्ध हों।
तो, आपकी पहली तालिका में एक और तालिका की एक विदेशी कुंजी हो सकती है जिसे अभी तक बनाया जाना है। ऐसे मामलों में, विदेशी_की_चेक अक्षम करें और डेटाबेस बनाएं।

बस अपनी स्क्रिप्ट के लिए निम्नलिखित जोड़ें:

SET FOREIGN_KEY_CHECKS=0; 

और यह काम करेगा।

+0

मैं तुम्हें एक बियर –

0

माईसैम का अभी उल्लेख किया गया है। बस जोड़ने का प्रयास करें ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; एक बयान के अंत में, यह मानते हुए कि आपकी अन्य टेबल MyISAM के साथ बनाई गई थीं।

CREATE TABLE IF NOT EXISTS `tablename` (
    `key` bigint(20) NOT NULL AUTO_INCREMENT, 
    FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 
0

मेरे मामले में, ऐसा हुआ जब एक टेबल InnoB है और दूसरा MyISAM है। MySQL वर्कबेंच के माध्यम से, एक तालिका का इंजन बदलना, मेरे लिए हल करता है।

2

त्रुटि कोड: 1005

हैलो, मैं इस सवाल का जवाब भर में डाल रहा हूँ ताकि किसी को भी वही समस्या का सामना करना पड़ की तरह मेरा इस प्रतिक्रिया के लिए फायदा हो सकता है।मुझे इस अनदेखी की जा सकती है) विश्वास करो (यह पहले से ही उत्तर दिया गया हो और यदि ऐसा है तो मुझे क्षमा करें)

मैं वही समस्या थी, इसलिए यहाँ कुछ चीजें है कि मैं (कोशिश की थी समाधान के अलावा कोई भी क्रम में नहीं हैं:))

  1. बदली गई विदेशी कुंजी नाम (काम नहीं किया)
  2. विदेशी कुंजी लंबाई
  3. डेटाटाइप्स सत्यापित (darn कुछ भी गलत नहीं)
  4. चेक अनुक्रमित कम
  5. चेक collations (सब कुछ ठीक, रफ़ू फिर से), कोई अच्छा उपयोग की
  6. तालिका कटे हुए
  7. मेज और फिर से बनाया
  8. यदि कोई वृत्तीय संदर्भ बनाया जा रहा है देखने के लिए कोशिश की छोड़ा --- सब ठीक

9. अंत में, मैंने देखा कि मेरे पास दो संपादक खुले हैं। एक है कि पीएचपीएसटॉर्म (जेटब्रेन) और अन्य MySQL वर्कबेंच में। ऐसा लगता है कि PHPStorm/SQL वर्कबेंच कुछ प्रकार के संपादन लॉक बनाता है। मैंने यह जांचने के लिए पीएचपीएसटॉर्म बंद कर दिया कि क्या लॉकिंग मामला था (यह दूसरी तरफ हो सकता था)। यह मेरी समस्या हल हो गई। उम्मीद है कि यह किसी को भी इसी तरह की समस्या रखने में मदद करता है।

2

मुझे एक ही त्रुटि थी। समस्या को बच्चे और अभिभावक तालिका के साथ करना था, जिसमें एक ही वर्णमाला और संयोजन नहीं था। यह इंजन = इनो डीबी डिफॉल्ट वर्ण SET = utf8 को जोड़कर तय किया जा सकता है;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; 

... SQL कथन पर इसका मतलब है कि कुछ गायब कोड हैं।

0

मेरे पास एक ही त्रुटि संदेश था। अंत में मैं पता लगा मैं आदेश में तालिका के नाम गलत वर्तनी:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id); 

बनाम

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id); 

मुझे आश्चर्य है कि क्यों पृथ्वी mysql पर नहीं बता सकता इस तरह के एक तालिका मौजूद नहीं है ...

1

विदेशी कुंजी के पास उस प्राथमिक कुंजी के समान सटीक प्रकार होना चाहिए जो संदर्भ में है। उदाहरण के लिए प्रकार "INT अहस्ताक्षरित शून्य नहीं" foreing कुंजी भी है है करने के लिए "INT अहस्ताक्षरित शून्य नहीं"

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(id) 
); 
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT, 
id_empl INT UNSIGNED NOT NULL, 
PRIMARY KEY(id), 
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices'; 
+0

अहस्ताक्षरित खरीद लेंगे मेरे लिए समस्या थी। धन्यवाद! –

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