त्रुटि कोड: 1005. तालिका नहीं बना सकते '...' (ग़लती से: 150)


103

मैंने इंटरनेट पर इस समस्या के समाधान की खोज की और स्टैक ओवरफ्लो प्रश्नों की जांच की, लेकिन किसी भी समाधान ने मेरे मामले के लिए काम नहीं किया।

मैं तालिका 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

क्या आप metal_kodतालिका के लिए स्कीमा दिखा सकते हैं ... उस तालिका में कौन सा फ़ील्ड विदेशी कुंजी संदर्भ होना चाहिए?
मंस

जवाबों:


271

त्रुटि कोड: 1005 - आपके कोड में एक गलत प्राथमिक कुंजी संदर्भ है

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

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

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

अधिक जानकारी के लिए, देखें: MySQL त्रुटि संख्या 1005 तालिका नहीं बना सकता


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

4
SHOW ENGINE INNODB STATUSजैसा कि इस प्रश्न में उल्लेख किया गया है मुझे मेरी विशेष समस्या का निदान करने में मदद मिली (PEBCAK, मेरे मामले में ...)
होबो

1
लानत है, यहां तक ​​कि यह एक प्राथमिक कुंजी है। आपको उस कुंजी के लिए अलग-अलग इंडेक्स बनाने की आवश्यकता है। धन्यवाद इसने मेरी समस्या हल कर दी।
RSB

3
# 4 मेरी समस्या थी - तालिकाओं में से एक MyISAM था और स्क्रिप्ट ने एक InnoDB तालिका बनाने की कोशिश की। मैं इस समस्या में भाग गया जब मैं एक पुरानी प्रणाली को शुरू करने की कोशिश कर रहा था जो शुरू में MySQL 5.0 या इसी तरह के संस्करण को चला रही थी, जहां डिफ़ॉल्ट भंडारण इंजन MyISAM था और स्क्रिप्ट ठीक चल रहे थे। मेरा वर्तमान वातावरण 5.5 है और डिफ़ॉल्ट भंडारण InnoDB है। set names 'utf8', storage_engine=MYISAM;स्क्रिप्ट की शुरुआत में जोड़ना मेरे लिए समस्या को हल करता है। विस्तृत जवाब के लिए @ user319198 और @Stefano को धन्यवाद! : ओ)
बोरिस चेरवेंकोव जूल

1
# 1 में उल्लिखित 'अहस्ताक्षरित' विशेषता याद आ रही थी, धन्यवाद!
हेल्वेट

11

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

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

SET FOREIGN_KEY_CHECKS=0;

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


4

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


4

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

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


2

मेरी भी ऐसी ही त्रुटि थी। समस्या बच्चे और माता-पिता की तालिका के साथ समान चारसेट और टकराव नहीं होने की थी। यह इंजन = InnoDB DEFAULT CHARACTER SET = utf8 को जोड़कर तय किया जा सकता है;

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

... SQL स्टेटमेंट पर इसका मतलब है कि कुछ मिसिंग कोड है।


2

विदेशी कुंजी में ठीक उसी प्रकार की कुंजी होती है जिस प्रकार प्राथमिक कुंजी का संदर्भ देता है। उदाहरण के लिए "INT UNSIGNED NOT NULL" टाइप किया गया है, जिसकी मुख्य कुंजी "INT UNSIGNED NOT NULL" भी है

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';

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

2

त्रुटि कोड: 1005

मेरे पास एक समान मुद्दा था, इसलिए यहां कुछ चीजें हैं जो मैंने कोशिश कीं (किसी भी क्रम में नहीं, समाधान को छोड़कर :))

  1. विदेशी कुंजी नाम बदल दिया (यह काम नहीं किया)
  2. विदेशी कुंजी लंबाई कम कर दी
  3. डेटाटाइप्स सत्यापित (गलत कुछ भी नहीं)
  4. अनुक्रमित की जाँच करें
  5. टकरावों की जांच करें (सब कुछ ठीक है, फिर से धराशायी करें)
  6. बिना किसी अच्छे उपयोग के, टेबल को काट दिया
  7. मेज गिरा दी और फिर से बनाया
  8. यह देखने की कोशिश की गई कि क्या कोई परिपत्र संदर्भ बनाया जा रहा है --- सभी ठीक
  9. अंत में, मैंने देखा कि मेरे दो संपादक खुले थे। एक जो PhpStorm (JetBrains) में और दूसरा MySQL वर्कबेंच में। ऐसा लगता है कि PhpStorm / MySQL Workbench किसी तरह का एडिट लॉक बनाता है।

    मैंने PhpStorm को केवल यह जांचने के लिए बंद कर दिया कि क्या लॉकिंग मामला था (यह दूसरे तरीके से हो सकता है)। इससे मेरी समस्या हल हो गई।


2

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

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

बनाम

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

मुझे आश्चर्य है कि धरती पर MySQL ऐसी कोई तालिका क्यों नहीं बता सकती है ...


1

MyISAM का सिर्फ उल्लेख किया गया है। बस इंजन जोड़ने का प्रयास करें = 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 ;

1

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


1

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

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

1

जाँच करें कि दोनों तालिकाओं में एक ही स्कीमा InnoDB MyISAM है। मैंने उन सभी को अपने मामले में InnoDB बनाया और काम किया


1

मेरी समस्या को सूचीबद्ध नहीं किया गया था, यह कुछ मूर्खतापूर्ण था ..... जिस तालिका FKमें पीके के रूप में एक समग्र PKथा वह इस तरह से घोषित किया गया था: प्राथमिक कुंजी ( CNPJ, CEP) मैं चाहता था कि सीईपी क्षेत्र FKएक और तालिका में हो और मैं था इस त्रुटि में फंसने से, कहानी के नैतिक ने प्राथमिक कुंजी ( CEP, CNPJ) के लिए ऊपर दिए गए कोड को उलट दिया और यह काम कर गया। उनके दोस्तों को टिप दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.