MySQL त्रुटि 1215: विदेशी कुंजी बाधा नहीं जोड़ सकता


336

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

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SQL स्क्रिप्ट निष्पादन समाप्त: कथन: 7 सफल हुआ, 1 विफल रहा

यहाँ पैरेंट टेबल के लिए SQL है।

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB

6
कृपया मूल तालिका के लिए स्कीमा पोस्ट करें: Clientsऔर Staff
इके वॉकर


1
@ डीनिस यह संभवतः एक डुप्लिकेट नहीं है क्योंकि ओपी कहते हैं कि उन्होंने सत्यापित किया है कि कॉलम पैरेंट टेबल में पीके हैं।
वाकर

मैंने अनुरोध के रूप में ग्राहकों और स्टाफ तालिकाओं के लिए एसक्यूएल बयान जोड़े हैं।
रॉबर्ट बी

जवाबों:


592

मुझे लगता है कि Clients.Case_Numberऔर / या Staff.Emp_IDबिल्कुल डेटा प्रकार के रूप में Clients_has_Staff.Clients_Case_Numberऔर नहीं कर रहे हैं Clients_has_Staff.Staff_Emp_ID

शायद मूल तालिका में कॉलम हैं INT UNSIGNED?

उन्हें दोनों तालिकाओं में ठीक एक ही प्रकार का डेटा होना चाहिए।


10
धन्यवाद। यह मुद्दा बन गया। Staff.Emp_ID एक लघु था, जबकि संदर्भित स्तंभ एक INT था। कभी-कभी यह छोटी चीजें हैं ...
रॉबर्ट बी

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

12
यह भी हो सकता है कि चरित्र सेट अलग हो। मेरे पास यह समस्या थी कि जहां एक कॉलम में utf8 कैरेक्टर सेट था जबकि दूसरे में latin1 था। आसानी से तय किए गए Tableचार्ज सेट के साथ तय = utf8; और ALTER तालिका Deviceपरिवर्तन कॉलम ID IDCHAR (36) अक्षर समूह 'UTF8' नहीं NULL;
www.jensolsson.se

3
@ www.jensolsson.se आप सही हैं, यदि PK में एक या अधिक स्ट्रिंग कॉलम शामिल हैं, तो उन्हें एक ही वर्ण सेट और टकराव का उपयोग करना चाहिए । इस विशिष्ट मामले में PK एक INT था इसलिए तालिका और / या स्तंभों का वर्ण सेट प्रासंगिक नहीं था।
वाकर

2
Collation मेरा मुद्दा था, लैटिन 1 बनाम utf8 (टेबल और कॉलम की जाँच करें)।
ben_979

244

कारण आपको एक विदेशी कुंजी बाधा हो सकती है:

  1. आप सभी तालिकाओं पर इंजन के रूप में InnoDB का उपयोग नहीं कर रहे हैं।
  2. आप लक्ष्य तालिका में कोई भी महत्वपूर्ण कुंजी संदर्भित करने का प्रयास कर रहे हैं। सुनिश्चित करें कि यह एक कुंजी है दूसरी मेज पर (यह एक प्राथमिक या अद्वितीय कुंजी हो सकती है)
  3. स्तंभों के प्रकार समान नहीं हैं (अपवाद तालिका संदर्भित स्तंभ पर अशक्त हो सकता है)।
  4. यदि PK / FK एक varchar है तो सुनिश्चित करें कि दोनों के लिए टकराव समान है।

अपडेट करें:

  1. इसका एक कारण यह भी हो सकता है कि आप जिस कॉलम का उपयोग कर रहे हैं, ON DELETE SET NULLवह शून्य नहीं है। इसलिए सुनिश्चित करें कि कॉलम डिफ़ॉल्ट अशक्त सेट है।

इनकी जांच करें।


14
मैं सिर्फ इतना जोड़ता हूं कि अगर एफके एक चरित्र स्तंभ पर है, तो मुझे लगता है कि उन्हें समान वर्ण और टकराव की आवश्यकता है। (या संभवतः 1-बाइट और 2-बाइट वर्ण संगत नहीं हैं।)
ग्राहम चार्ल्स

5
मेरा कारण आपका पहला संकेत था "दो टेबल के लिए अलग-अलग डीबी इंजन,
इनोबीडी

7
मुझे एक और कारण मिला है =) `` अपडेट के आधार पर अपडेट करें पूरा सेट: `` `आपने एक सेट पूर्ण स्थिति को परिभाषित किया है, हालांकि कुछ स्तंभों को नल के रूप में परिभाषित नहीं किया गया है। तो, मैं सिर्फ एफके परिभाषा को ठीक करता हूं।
15

1
इसके अलावा संभावित विफलता लक्ष्य क्षेत्र पर सूचकांक की अनुपस्थिति है
पॉल टी। रॉकेन

1
अच्छा, 4 था बिंदु मेरी समस्या थी। यह बहुत बुरा है - लेकिन मैं बहुत खुश हूँ mysql के लिए दुर्घटना हुई
सेब

85

दूसरों के लिए समान त्रुटि हमेशा कॉलम प्रकार के बेमेल के कारण नहीं हो सकती है, आप कमांड जारी करके mysql foriegn कुंजी त्रुटि के बारे में अधिक जानकारी प्राप्त कर सकते हैं

SHOW ENGINE INNODB STATUS;

आप मुद्रित संदेश के शीर्ष के पास एक त्रुटि पा सकते हैं जैसे कुछ

संदर्भित तालिका में एक सूचकांक नहीं मिल सकता है जहाँ संदर्भित कॉलम तालिका में पहले कॉलम या स्तंभ प्रकार के रूप में दिखाई देते हैं और संदर्भित तालिका बाधा के लिए मेल नहीं खाती है।


13
यह सबसे अच्छा जवाब है मुझे लगता है कि इसका कारण नैदानिक ​​में मदद करता है! धन्यवाद।
15

कैसे काम करना चाहिए? एक पंक्ति में दोनों प्रश्नों का निष्पादन करें?
C4d

@ C4u, हाँ हमें एक पंक्ति में दोनों प्रश्नों का निष्पादन पहले के रूप में SHOW इंजन INNODB STATUS करके करना चाहिए और उसके बाद अन्य प्रश्नों के साथ करना चाहिए
sureshd

PHPMyAdmin पर यह काम नहीं करेगा। कमांड प्रॉम्प्ट पर करें।
रूबल 800००

13

त्रुटि 1215 एक कष्टप्रद है। धमाका गोली का जवाब मूल बातें शामिल हैं। आप वहां से शुरुआत करना सुनिश्चित करना चाहते हैं। हालाँकि, देखने के लिए और भी बहुत से सूक्ष्म मामले हैं:

उदाहरण के लिए, जब आप विभिन्न तालिकाओं के प्राथमिक कुंजी लिंक करने का प्रयास करते हैं, तो उचित ON UPDATEऔर ON DELETEविकल्प प्रदान करना सुनिश्चित करें। उदाहरण के लिए:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

उड़ान नहीं होगी, क्योंकि प्राथमिक कुंजी (जैसे id) नहीं हो सकती NULL

मुझे यकीन है, इस प्रकार की बाधाओं को जोड़ने पर और भी अधिक, समान रूप से सूक्ष्म मुद्दे हैं, यही कारण है कि जब बाधाओं में कमी आती है, तो हमेशा सुनिश्चित करें कि बाधाएं और उनके निहितार्थ आपके वर्तमान संदर्भ में समझ में आते हैं। आपकी त्रुटि 1215 के साथ शुभकामनाएँ!


1
यदि आप किसी विदेशी कुंजी को हटाने की कोशिश नहीं करते हैं तो भी आपको यह त्रुटि मिलेगी: :)
धमाका गोलियां

2
डॉक्स से भी: MySQL को विदेशी कुंजी और संदर्भित कुंजी पर अनुक्रमित करने की आवश्यकता होती है ताकि विदेशी कुंजी जांच तेज हो और टेबल स्कैन की आवश्यकता न हो। संदर्भित तालिका में, एक सूचकांक होना चाहिए जहां विदेशी कुंजी कॉलम को उसी क्रम में पहले कॉलम के रूप में सूचीबद्ध किया गया है । इस तरह के सूचकांक को संदर्भित तालिका पर स्वचालित रूप से बनाया जाता है यदि यह मौजूद नहीं है। यह इंडेक्स चुपचाप बाद में गिराया जा सकता है, यदि आप एक अन्य इंडेक्स बनाते हैं जिसका उपयोग विदेशी कुंजी बाधा को लागू करने के लिए किया जा सकता है। index_name, यदि दिया गया है, जैसा कि पहले वर्णित है।
जोनाथन एम

1
यही कारण है कि मैं यहां आया था: मैंने ON DELETE SET NULLएक स्तंभ पर एक विदेशी कुंजी बनाने की कोशिश की थी जो मैं चाहता था NOT NULL। मान लीजिए कि आपके पास अपना केक नहीं है और वह भी खा सकता है।
मार्टिन हेन्निंग्स

8

तालिका के टकराव की SHOW TABLE STATUSजांच करें , उपयोग करके आप तालिकाओं सहित तालिकाओं के बारे में जानकारी की जाँच कर सकते हैं।

दोनों तालिकाओं का समान समतलीकरण होना है।

यह मेरे साथ हुआ है।


मेरे मामले में यह समस्या थी - MySQL त्रुटि बिल्कुल भी मददगार नहीं है!
जुडलिंग

7

मेरे मामले में, मैं एक मेज नष्ट कर दिया था का उपयोग कर SET FOREIGN_KEY_CHECKS=0, फिर SET FOREIGN_KEY_CHECKS=1बाद। जब मैं टेबल को फिर से लोड करने के लिए गया, तो मुझे मिल गया error 1215। समस्या यह थी कि डेटाबेस में एक और तालिका थी जिसमें मेरे द्वारा हटाए गए तालिका की एक विदेशी कुंजी थी और पुनः लोड हो रही थी। पुन: लोड करने की प्रक्रिया के एक हिस्से में एक फ़ील्ड के लिए डेटा प्रकार बदलना शामिल है, जिसने दूसरी तालिका से विदेशी कुंजी को अमान्य बना दिया, इस प्रकार ट्रिगर किया गया error 1215। मैंने ड्रॉपिंग करके समस्या का समाधान किया और फिर शामिल फ़ील्ड के लिए नए डेटा प्रकार के साथ दूसरी तालिका को फिर से लोड किया।


5

Fk जोड़ने का प्रयास करते समय मुझे वही त्रुटि मिली। मेरे मामले में समस्या एफके टेबल के पीके के कारण हुई थी जिसे अहस्ताक्षरित के रूप में चिह्नित किया गया था।


5

एक ऐसी गड़बड़ी है जिसे मैंने "त्रुटि 1215: अनुभवी विदेशी कुंजी बाधा" के साथ जोड़ा है, जब लारवेल 4 का उपयोग किया जाता है, विशेष रूप से जेफ्रीवे के लारवेल 4 जेनरेटर के साथ।

Laravel 4 में, आप जेफरीवे के जेनरेटरों का उपयोग माइग्रेशन फ़ाइलों को एक-एक करके टेबल बनाने के लिए कर सकते हैं, जिसका अर्थ है, प्रत्येक माइग्रेशन फ़ाइल एक टेबल जेनरेट करती है। आपको इस तथ्य के बारे में पता होना चाहिए कि प्रत्येक माइग्रेशन फ़ाइल फ़ाइल नाम में टाइमस्टैम्प के साथ उत्पन्न होती है, जो फाइलों को एक आदेश देती है। जब आप आर्टिसन CLI कमांड "php कारीगर माइग्रेट" फायर करते हैं तो जेनरेशन का ऑर्डर माइग्रेशन ऑपरेशन का भी ऑर्डर होता है। इसलिए, यदि कोई फ़ाइल किसी कुंजी को संदर्भित करने वाली एक विदेशी कुंजी बाधा के लिए कहती है, जो कि होगी, लेकिन अभी तक नहीं, तो बाद की फ़ाइल में उत्पन्न हुई, त्रुटि 1215 निकाल दी जाती है। ऐसे मामले में, आपको क्या करना है, माइग्रेशन फ़ाइलों के निर्माण के क्रम को समायोजित करें। नई फ़ाइलों को उचित क्रम में, कॉपी-इन सामग्री उत्पन्न करें, फिर अव्यवस्थित पुरानी फ़ाइलों को हटा दें।


3

मेरे पास एक ही मुद्दा था, मेरा समाधान:

इससे पहले:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

समाधान:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

मुझे आशा है कि यह मदद करेगा;)


1
आप अपनी पहली
रचना

3

मुझे भी यही समस्या थी।
मैंने इसे करते हुए हल किया:

मैंने निम्नलिखित लाइन बनाई
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

मुझे अपने स्कीमा बिल्डर में एक तालिका आयात करने की कोशिश करने के बाद इस समाधान का पता चला। अगर यह आपके लिए काम करता है, तो मुझे बताएं!

सौभाग्य!

फेलिप ट्रेसीओ


3

मैं सिर्फ इस मामले को जोड़ना चाहता था VARCHAR विदेशी कुंजी संबंध के । मैंने पिछले सप्ताह MySQL Workbench 8.0 में यह पता लगाने की कोशिश की और आखिरकार त्रुटि को ठीक करने में सक्षम था।

संक्षिप्त उत्तर: स्कीमा, तालिका, स्तंभ, संदर्भित तालिका, संदर्भ स्तंभ और किसी भी अन्य तालिकाओं के वर्ण सेट और टकराव जो मूल तालिका के संदर्भ में मेल खाते हैं।

दीर्घ उत्तर: मेरी तालिका में एक ENUM डेटाटाइप था। मैंने इसे बदल दिया है VARCHARऔर मैं संदर्भ तालिका से मान प्राप्त कर सकता हूं ताकि मुझे अतिरिक्त विकल्प जोड़ने के लिए मूल तालिका को बदलना न पड़े। यह विदेशी-कुंजी संबंध सीधा लग रहा था लेकिन मुझे 1215 त्रुटि मिली। अरविंद के जवाब और निम्नलिखित लिंक के उपयोग का सुझाव दिया

SHOW ENGINE INNODB STATUS;

इस आदेश का उपयोग करने पर मुझे कोई अतिरिक्त उपयोगी जानकारी नहीं मिली त्रुटि के लिए निम्नलिखित क्रिया वर्णन मिला

संदर्भित तालिका में एक सूचकांक नहीं मिल सकता है जहाँ संदर्भित स्तंभ तालिका में पहले कॉलम या स्तंभ प्रकार के रूप में दिखाई देते हैं और संदर्भित तालिका बाधा के लिए मेल नहीं खाती है। ध्यान दें कि ENUM और SET का आंतरिक संग्रहण प्रकार> = InnoDB-4.1.12 के साथ बनाई गई तालिकाओं में बदल गया है, और पुराने तालिकाओं में ऐसे स्तंभों को नए तालिकाओं में ऐसे स्तंभों द्वारा संदर्भित नहीं किया जा सकता है। कृपया सही विदेशी कुंजी परिभाषा के लिए http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html देखें ।

जिसके बाद मैंने SET FOREIGN_KEY_CHECKS=0;सुझाव के रूप में इस्तेमाल किया अरविंद भारद्वाज लिंक और यहां दिए गए लिंक का उपयोग किया :

इसने निम्न त्रुटि संदेश दिया:

त्रुटि कोड: 1822. विदेशी कुंजी बाधा जोड़ने में विफल। बाधा के लिए अनुक्रमणिका गुम

इस बिंदु पर, मैं स्कीमा को रिवर्स इंजीनियर-एड करता हूं और मैं ईईआर आरेख में विदेशी-कुंजी संबंध बनाने में सक्षम था। 'आगे इंजीनियर'-इंग पर, मुझे निम्नलिखित त्रुटि मिली:

1452 त्रुटि: चाइल्ड रो को जोड़ या अपडेट नहीं किया जा सकता: एक विदेशी कुंजी बाधा विफल

जब मैं एक नए स्कीमा में ईईआर आरेख इंजीनियर-फॉरवर्ड करता हूं, तो एसक्यूएल स्क्रिप्ट बिना मुद्दों के चलती है। आगे के इंजीनियर के प्रयासों से उत्पन्न एसक्यूएल की तुलना करने पर, मैंने पाया कि अंतर चरित्र सेट और टकराव था। पैरेंट टेबल, चाइल्ड टेबल और दो कॉलम में utf8mb4कैरेक्टर सेट और utf8mb4_0900_ai_ciकॉलेशन था, हालांकि, पैरेंट टेबल में एक और कॉलम का उपयोग करके संदर्भित किया गया थाCHARACTER SET = utf8 , COLLATE = utf8_bin ; को एक अलग चाइल्ड टेबल ।

पूरे स्कीमा के लिए, मैंने सभी तालिकाओं और सभी स्तंभों के लिए वर्ण सेट और टकराव को निम्न में बदल दिया:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

इसने अंततः 1215 त्रुटि के साथ मेरी समस्या को हल किया।

साइड नोट: कोलाज utf8mb4_general_ciMySQL वर्कबेंच 5.0 या बाद में काम करता है। Collation utf8mb4_0900_ai_ciMySQL Workbench 8.0 या उच्चतर के लिए काम करता है। मेरा मानना ​​है कि मेरे द्वारा कैरेक्टर सेट और कोलाज के साथ मुद्दों की एक वजह MySQL वर्कबेंच अपग्रेड के बीच 8.0 के कारण है। यहाँ एक लिंक है जो इस टकराव के बारे में अधिक बात करता है।


2

मुझे यह त्रुटि नहीं मिली

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

2

यह तब भी होता है जब स्तंभों का प्रकार समान नहीं होता है।

जैसे अगर आप जिस कॉलम का जिक्र कर रहे हैं वह UNSIGNED INT है और जिस कॉलम को संदर्भित किया जा रहा है वह INT है तो आपको यह त्रुटि मिलती है।


2

MySQL (INNODB) के लिए ... उन स्तंभों के लिए परिभाषाएँ प्राप्त करें जिन्हें आप लिंक करना चाहते हैं

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

दोनों स्तंभ परिभाषाओं की तुलना और सत्यापन करें

एक ही COLUMN_TYPE (लंबाई), एक ही रंग

की तरह खेलने के लिए उपयोगी हो सकता है

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;

2

टेबल संगतता के लिए जाँच करें। उदाहरण के लिए, यदि एक तालिका है MyISAMऔर दूसरी है InnoDB, तो आपके पास यह समस्या हो सकती है।


2

दूसरा कारण: यदि आप उन ON DELETE SET NULL सभी स्तंभों का उपयोग करते हैं जो विदेशी कुंजी में उपयोग किए जाते हैं, तो उन्हें शून्य मानों की अनुमति देनी चाहिए। किसी और को इस प्रश्न में पता चला ।

मेरी समझ से यह डेटा अखंडता के बारे में कोई समस्या नहीं होगी, लेकिन ऐसा लगता है कि MySQL इस सुविधा का समर्थन नहीं करता है (5.7 में)।


1

जब यह त्रुटि तब होती है क्योंकि संदर्भित तालिका MyISAM इंजन का उपयोग करती है तो यह उत्तर आपके डेटाबेस को परिवर्तित करने का एक त्वरित तरीका प्रदान करता है ताकि सभी Django मॉडल तालिकाएँ InnoDB का उपयोग करें: https://stackoverflow.com/a/15389961/2950621

यह एक Django प्रबंधन कमांड है जिसे Convert_to_innodb कहा जाता है।


1

Wooo मैं बस मिल गया! यह पहले से ही पोस्ट किए गए उत्तर (innoDB, अहस्ताक्षरित, आदि) के बहुत से मिश्रण था। एक बात जो मुझे यहाँ दिखाई नहीं दी, वह यह है: यदि आपका FK किसी PK पर इंगित कर रहा है, तो सुनिश्चित करें कि स्रोत कॉलम का एक मूल्य है जो समझ में आता है। उदाहरण के लिए, यदि पीके एक माध्यम (8) है, तो सुनिश्चित करें कि स्रोत स्तंभ में भी एक माध्यम (8) है। वह मेरे लिए समस्या का हिस्सा था।


1

मेरे लिए यह कॉलम के प्रकार थे। बिगनेट! = INT।

लेकिन तब भी यह काम नहीं किया।

इसलिए मैंने इंजनों की जाँच की। सुनिश्चित करें कि Table1 = InnoDB और Table = InnoDB


1

मैंने इस त्रुटि को पूरी तरह से अलग कारण से अनुभव किया। मैंने अपने डेटा मॉडल (भयानक उपकरण) बनाने के लिए MySQL Workbench 6.3 का उपयोग किया। मैंने देखा कि जब विदेशी कुंजी बाधा परिभाषा में परिभाषित स्तंभ क्रम तालिका स्तंभ क्रम में फिट नहीं होता है तो यह त्रुटि भी उत्पन्न होती है।

मुझे सब कुछ आज़माने में 4 घंटे लग गए लेकिन जाँच कर रहा था।

अब सब अच्छी तरह से काम कर रहा है और मैं कोडिंग पर वापस जा सकता हूं। :-)


उससे तुम्हारा क्या मतलब है?
यज़ान जाबेर

2
@YazanJaber मुझे लगता है कि उनका यह अर्थ है : InnoDB किसी भी इंडेक्स कॉलम या कॉलम के समूह को संदर्भित करने के लिए एक विदेशी कुंजी की अनुमति देता है। हालांकि, संदर्भित तालिका में, एक सूचकांक होना चाहिए जहां संदर्भित कॉलम उसी क्रम में पहले कॉलम के रूप में सूचीबद्ध हैं।
रॉबश

1

लार्वा प्रवास का उपयोग करते समय विदेशी कुंजी बनाने का प्रयास करें

इस उदाहरण की तरह:

उपयोगकर्ता तालिका

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

रंग तालिका

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

कभी-कभी गुण काम नहीं करते थे

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

यह त्रुटि इसलिए हुई क्योंकि [उपयोगकर्ता तालिका] में विदेशी कुंजी (प्रकार) प्राथमिक कुंजी (प्रकार) से [रंग तालिका] में भिन्न है

इस समस्या को हल करने के लिए [रंग तालिका] में प्राथमिक कुंजी को बदलना चाहिए

$table->tinyIncrements('id');


जब आप प्राथमिक कुंजी का उपयोग करते हैं $table->Increments('id');

आपको उपयोग करना चाहिए Integerएक विदेशी कुंजी के रूप में

    $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

जब आप प्राथमिक कुंजी का उपयोग करते हैं $table->tinyIncrements('id');

आपको उपयोग करना चाहिए unsignedTinyIntegerएक विदेशी कुंजी के रूप में

    $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

जब आप प्राथमिक कुंजी का उपयोग करते हैं $table->smallIncrements('id');

आपको unsignedSmallIntegerएक विदेशी कुंजी के रूप में उपयोग करना चाहिए

    $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

जब आप प्राथमिक कुंजी का उपयोग करते हैं $table->mediumIncrements('id');

आपको unsignedMediumIntegerएक विदेशी कुंजी के रूप में उपयोग करना चाहिए

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

इससे मुझे मदद मिलती है। मेरे पास bigIncrementsप्राथमिक कुंजी के रूप में था , इसलिए मुझे उपयोग करने की आवश्यकता थीunsignedBigInteger
jagad89

1

मेरे मामले में मुझे FOREIGN KEYचेक को निष्क्रिय करना पड़ा क्योंकि स्रोत तालिका मौजूद नहीं थी।

SET FOREIGN_KEY_CHECKS=0;


0

Backquotes के उपयोग के बारे में भी जागरूक रहें। मैं एक स्क्रिप्ट में निम्नलिखित कथन था

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

लेकिन अंत में backquotes झूठे थे। इसे होना चाहिए था:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

MySQL ने इस त्रुटि पर कोई जानकारी नहीं दी ...


0

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


0

मुझे पता है कि मैं पार्टी में बहुत देर से आया हूं, लेकिन मैं इसे यहां रखना चाहता हूं ताकि यह सूचीबद्ध हो।

साथ ही उपरोक्त सभी सलाह यह सुनिश्चित करने के लिए कि फ़ील्ड समान रूप से परिभाषित हैं, और टेबल प्रकारों का भी समान टकराव है, सुनिश्चित करें कि आप उन फ़ील्ड्स को लिंक करने की कोशिश करने की गलती नहीं करते हैं जहां CHILD फ़ील्ड में डेटा नहीं है पहले से ही क्षेत्र में। यदि आपके पास CHILD फ़ील्ड में डेटा है जो आपने पहले ही PARENT फ़ील्ड में दर्ज नहीं किया है, तो यह त्रुटि पैदा करेगा। यह शर्म की बात है कि त्रुटि संदेश कुछ अधिक उपयोगी नहीं है।

यदि आप अनिश्चित हैं, तो विदेशी कुंजी वाली तालिका का बैकअप लें, सभी डेटा हटा दें और फिर विदेशी कुंजी बनाने का प्रयास करें। अगर सफल है तो आप क्या करें!

सौभाग्य।


0

यह एक सूक्ष्म संस्करण है जो पहले ही कहा जा चुका है, लेकिन मेरे उदाहरण में, मेरे पास 2 डेटाबेस (फू और बार) थे। मैंने पहले foo बनाया और मुझे यह महसूस नहीं हुआ कि यह bar.baz (जो अभी तक नहीं बनाया गया था) में एक विदेशी कुंजी को संदर्भित करता है। जब मैंने bar.baz (बिना किसी विदेशी कुंजी) बनाने की कोशिश की, तो मुझे यह त्रुटि मिलती रही। थोड़ी देर इधर-उधर देखने के बाद मुझे फू में विदेशी चाभी मिली।

तो, लंबी कहानी संक्षेप में, यदि आपको यह त्रुटि मिलती है, तो आपके पास बनाई जा रही तालिका में पहले से मौजूद विदेशी कुंजी हो सकती है।


0

मेरे लिए, 1215 त्रुटि तब हुई जब मैं द्वारा बनाई गई एक डंपफाइल आयात कर रहा था mysqldump, जो तालिका को वर्णानुक्रम में बनाता है, जो मेरे मामले में, बाद में फ़ाइल में बनाई गई संदर्भ तालिकाओं के लिए विदेशी कुंजी का कारण बना। (इसे इंगित करने के लिए इस पृष्ठ पर जाएँ : https://www.percona.com/blog/2017/04/06/deal-mysql-error-code-1215-cannot-add-foreign-key-constraint/ )

चूंकि mysqldump वर्णानुक्रम में तालिकाएँ बनाता है और मैं तालिकाओं के नाम नहीं बदलना चाहता था, इसलिए मैंने इस पृष्ठ पर जेरेमी वियर के उत्तर में निर्देशों का पालन किया , जो set FOREIGN_KEY_CHECKS = 0;डंप फ़ाइल के शीर्ष पर रखने के लिए कहता हैSET FOREIGN_KEY_CHECKS = 1; के नीचे रखने के लिए ।

उस समाधान ने मेरे लिए काम किया।


0

इसलिए मैंने उपरोक्त सभी सुधारों की कोशिश की और कोई भाग्य नहीं। मुझे अपनी तालिकाओं में त्रुटि याद आ रही है-अन्याय का कारण नहीं मिल सका और मैं 1215 त्रुटि प्राप्त करता रहा। इसलिए मैंने इस फिक्स का उपयोग किया।

PhpMyAdmin में मेरे स्थानीय वातावरण में, मैंने प्रश्न में तालिका से डेटा निर्यात किया। मैंने CSV का प्रारूप चुना। अभी भी चयनित तालिका के साथ phpMyAdmin में, मैंने "अधिक-> विकल्प" चुना। यहां मैंने "कॉपी टेबल टू (डेटाबेस.टेबल)" पर स्क्रॉल किया। "केवल संरचना का चयन करें" तालिका का नाम बदलें, शायद वर्तमान टेबल नाम के आगे "कॉपी" शब्द जोड़ें। "जाओ" पर क्लिक करें यह एक नया निर्माण करेगा। तालिका। नई तालिका निर्यात करें और इसे नए या अन्य सर्वर पर आयात करें। मैं यहां phpMyAdmin का भी उपयोग कर रहा हूं। एक बार आयात होने के बाद तालिका का नाम उसके मूल नाम में बदल दें। नई तालिका का चयन करें, आयात का चयन करें। प्रारूप के लिए CSV का चयन करें। "विदेशी कुंजी जांच सक्षम करें" को अनचेक करें "गो" का चयन करें। अब तक सभी अच्छा काम कर रहे हैं।

मैंने अपने ब्लॉग पर अपना फिक्स पोस्ट किया ।


-1

यहां तक ​​कि मुझे भी यही समस्या थी। और गलती एफके की तालिका पीके में "अहस्ताक्षरित" मार्कर के साथ थी


-6

मुझे एक बार एक ही त्रुटि हुई थी। मैंने अभी-अभी MySQL सर्वर को पुनः आरंभ किया और समस्या को ठीक किया।


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