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


174

तालिका एक

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| UserID   | int(11)     | NO   | PRI | NULL    | auto_increment |
| Password | varchar(20) | NO   |     |         |                |
| Username | varchar(25) | NO   |     |         |                |
| Email    | varchar(60) | NO   |     |         |                |
+----------+-------------+------+-----+---------+----------------+

तालिका 2

+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| UserID           | int(11)      | NO   | MUL |         |                |
| PostID           | int(11)      | NO   | PRI | NULL    | auto_increment |
| Title            | varchar(50)  | NO   |     |         |                |
| Summary          | varchar(500) | NO   |     |         |                |
+------------------+--------------+------+-----+---------+----------------+

त्रुटि:

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: 
Cannot add or update a child row: a foreign key constraint fails 
(`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`) 
REFERENCES `table1` (`UserID`)) 

मैंने क्या गल्त किया है? मैं http://www.w3schools.com/Sql/sql_foreignkey.asp पढ़ता हूं और मुझे नहीं दिखता कि क्या गलत है।


4
क्या आप उस क्वेरी को पोस्ट कर सकते हैं जो त्रुटि को ट्रिगर करती है?
नम

38
संक्षेप में, आप table2.UserIDउस मूल्य को सम्मिलित / अद्यतन करने का प्रयास कर रहे हैं जिसमें मौजूद नहीं है table1.UserID
जो स्टेफनेली

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

जवाबों:


235

आपको यह त्रुटि इसलिए मिल रही है क्योंकि आप table2उस पंक्ति को जोड़ने / अपडेट करने का प्रयास कर रहे हैं UserIDजिसमें वर्तमान में संग्रहीत मानों के आधार पर फ़ील्ड के लिए कोई मान्य मान नहीं है table1। यदि आप कुछ और कोड पोस्ट करते हैं तो मैं आपको विशिष्ट कारण का पता लगाने में मदद कर सकता हूं।


ReadyedStatement st = connection.prepareStatement ("तालिका 2 में डालें (UserID, PostID, शीर्षक, सारांश)" + "मान (UserID ;,?)?")
टॉम

15
यह सुनिश्चित नहीं है कि गिरावट किस लिए है; मेरा उत्तर पूरी तरह से मान्य और सही है।
ब्रायन ड्रिस्कॉल

हम्म ... यह निश्चित रूप से आपके तैयार किए गए बयान में अनाम पैरामीटर के साथ नामित मापदंडों को मिश्रण करने के लिए एक अच्छा विचार नहीं है। यह आपके निष्पादन विवरण में निर्दिष्ट UserID के लिए उचित मूल्य के साथ "मान (?, ?, ?,?") होना चाहिए।
ब्रायन ड्रिस्कॉल

इसलिए मुझे टेबल 1 से उपयोगकर्ता को प्राप्त करने के लिए एक और एसक्यूएल स्टेटमेंट करने की आवश्यकता है?
टॉम

5
सबसे अधिक संभावना 0, अगर यह मामला है तो इसे नल द्वारा प्रतिस्थापित करें
जेफरी निकोल्सन कार्रे

123

इसका मतलब है कि आप में डालने की कोशिश कर रहे table2एक UserIDमूल्य है कि में मौजूद नहीं है table1


104

टेबल पर किसी भी ऑपरेशन को करने से पहले एक साधारण हैक विदेशी कुंजी जांच को अक्षम कर सकता है। बस क्वेरी

SET FOREIGN_KEY_CHECKS=0

यह किसी भी अन्य तालिकाओं के खिलाफ विदेशी कुंजी मिलान को अक्षम कर देगा। आपके द्वारा तालिका के साथ किए जाने के बाद इसे फिर से सक्षम करें

SET FOREIGN_KEY_CHECKS=1

यह मेरे लिए बहुत बार काम करता है।


मैं यह कैसे उपयोग करता हूँ ??
सचिन पुणे में

2
@SachinfromPune बस SET FOREIGN_KEY_CHECKS = 0 जोड़ें; mysql फ़ाइल की शुरुआत में और SET FOREIGN_KEY_CHECKS = 1; mysql फ़ाइल के अंत में, डेटा reimport
inrsaurabh

1
क्या यह समस्यात्मक नहीं है? आप संदर्भात्मक अखंडता खो देते हैं, है ना?
रोडरनर 66

सही इंडेक्स प्रविष्टियों की उपस्थिति द्वारा रेफ़रेंशियल अखंडता का समर्थन किया जाता है। जब तक आपको अपनी चाबियाँ और इंडेक्स सही मिले हैं, तब तक आपको थोक इनपुट के दौरान कुंजी जांच को अक्षम करना चाहिए।
वर्नोन कीनन

46

मुझे एक और अजीब मामला पता चला है: यदि आप गलती से इनोबीडी टेबल से एक MyISAM तालिका में एक विदेशी कुंजी बनाते हैं, तो MySQL इस त्रुटि को सम्मिलित करने के समय फेंकता है, भले ही डेटा अन्यथा मान्य हो।

Http://nick.zoic.org/art/mysql-foreign-key-error/ देखें


1
हां, मुझे भी यही समस्या है। दो टेबल होना चाहिए InnoDB!
पन्नाधाय

2
मुझे एक ही समस्या थी, टिप के लिए धन्यवाद। यहाँ MySQL प्रलेखन का एक लिंक दिया गया है कि कैसे टेबल को MyISAM से InnoDB dev.mysql.com/doc/refman/5.7/en/… TLDR में परिवर्तित किया जा सकता है: सारणी सारणी तालिका_नाम इंजन = InnoDB;
गुइलहर्मे वाज

वास्तव में, यह मेरे डेटाबेस में मामला था। मैंने MyISAM इंजन को InnoDB में बदलने का फैसला किया। अंत में, मैं डेटाबेस के साथ काम कर सकता हूं जिस तरह से मैं चाहता था।
माइक

17

आपको यह त्रुटि इसलिए मिल रही है क्योंकि कुछ मान int हैं table2.UserIDजो मौजूद नहीं हैं table1.UserID(मुझे लगता है कि आपने table2.UserIDइस विदेशी मुद्रा को बनाने से पहले मूल्य मैनुअल का निपटारा किया है)।
इस दृश्य के लिए एक उदाहरण: table1.UserID1,2,3 table2.UserIDमान प्राप्त करें और मान 4 प्राप्त करें (मैनुअल द्वारा जोड़ें)। तो जब आप एक विदेशी कुंजी करते हैं, वे नहीं मिल सकता UserID = 4से table1और त्रुटि ocurse होगा।
इस त्रुटि को ठीक करने के लिए, बस को दूर UserID = 4से table2या आप उन दोनों को खाली और फिर विदेशी कुंजी बना सकते हैं और।
सौभाग्य!


11

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

उदाहरण के लिए Table2 में निम्नलिखित डेटा है:

UserID    PostID    Title    Summary
5         1         Lorem    Ipsum dolor sit

तालिका एक

UserID    Password    Username    Email
9         ********    JohnDoe     john@example.com

यदि आप तालिका 2 को बदलने और एक विदेशी कुंजी जोड़ने का प्रयास करते हैं तो क्वेरी विफल हो जाएगी क्योंकि तालिका 1 में UserID = 5 मौजूद नहीं है।


10

यदि आपने तालिका 2 में विदेशी कुंजी बनाने से पहले तालिका 1 में एक पंक्ति डाली है, तो आपको एक विदेशी कुंजी बाधा त्रुटि मिलेगी, क्योंकि तालिका 2 में ऑटो वेतन वृद्धि मूल्य 2 है और तालिका 2 में 1 है। इसे हल करने के लिए आपको 1 टेबल को अलग करें और ऑटो इंक्रीमेंट वैल्यू को 1. पर सेट करें। फिर आप टेबल 2 को जोड़ सकते हैं।


10

सुनिश्चित करें कि आपने डेटाबेस इंजन को InnoDB पर सेट किया है क्योंकि MyISAM में विदेशी कुंजी और लेनदेन समर्थित नहीं हैं


2
ALTER TABLE my_table Engine = InnoDB;
बिश्व मिश्र

7

बस थोड़ा ठीक करें : Table1 में JoinColumn को 'nullable = true' बनाएं और Table2 में 'UserID' फ़ील्ड को 'insertable = false' और 'nullable = true' को।

तालिका 1 इकाई में:

@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;

तालिका 2 इकाई में:

@Column(insertable = false, nullable = true)
private int UserID;

इस जवाब ने मेरी समस्या को पूरी तरह से हल कर दिया, इसे साझा करने के लिए बहुत-बहुत धन्यवाद। मेरे लिए कुंजी @Column (सम्मिलन योग्य = गलत, अशक्त = सत्य) जोड़ रही थी जो मैं अपने बच्चे की वस्तु / तालिका में foraeing कुंजी के रूप में उपयोग कर रहा हूं।
इज़राइल

6

मुझे बस एक ही समस्या थी कि समाधान आसान है।

आप चाइल्ड टेबल में एक आईडी जोड़ने की कोशिश कर रहे हैं जो पैरेंट टेबल में मौजूद नहीं है

अच्छी तरह से जांच लें, क्योंकि InnoDB में बग है जो कभी-कभी मूल्यों को जोड़ने के बिना स्वतः_ कॉलम बढ़ाता है, उदाहरण के लिए, INSERT ... ON DUPLICATE KEY


गंभीरता से? एक आईडी संदर्भ न डालें जो मौजूद नहीं है ... बस चेक करें
ब्लेज़टिक्स

5

मेरा मुद्दा भी ऐसा ही था। आप एक मेज पर विदेशी कुंजी लगाने की कोशिश कर रहे हैं जिसमें सामग्री है और स्तंभ अशक्त नहीं है। आपके पास दो विकल्प हैं।

  1. जिस स्तंभ पर आप विदेशी कुंजी को लागू करना चाहते हैं उसे अशक्त होने के लिए बनाएं। इस तरह विदेशी कुंजी यह जानकर लागू होगी कि कुछ क्षेत्र अशक्त हो सकते हैं। ( यह वही है जो मैंने किया था। )
  2. वह कॉलम बनाएं जिस पर आप विदेशी कुंजी बाधा लागू करना चाहते हैं, कॉलम में विदेशी कुंजी डालने के लिए एक प्रश्न लिखें और फिर विदेशी कुंजी बाधाओं को लागू करें। ( यह कोशिश नहीं की लेकिन यह काम करना चाहिए )

4

सुनिश्चित करें कि आप विदेशी कुंजी में जो मूल्य डाल रहे हैं, वह मूल तालिका में मौजूद है। इससे मुझे मदद मिली। उदाहरण के लिए यदि आप इसमें सम्मिलित user_id = 2करते हैं table.2, लेकिन आपके table.1पास नहीं है user_id = 2, तो बाधा एक त्रुटि फेंक देगी। मेरा त्रुटि कोड # 1452 सटीक था। आशा है कि यह उसी समस्या के साथ किसी और की मदद करता है!


3

मेरे पास एक ही मुद्दा था, और इसका कारण यह था कि विदेशी कुंजी जोड़ने से पहले मेरे पास पहली तालिका में एक पंक्ति थी।


1

मुझे भी इसी मुद्दे का सामना करना पड़ा और यह मुद्दा मेरी मूल तालिका प्रविष्टियों का था जो विदेशी कुंजी तालिका मूल्य से मेल नहीं खाती थी। तो कृपया सभी पंक्तियों को स्पष्ट करने के बाद प्रयास करें।


बाधा की आवश्यकता है कि तालिका 2 में संदर्भित उपयोगकर्ता तालिका 1 में पहले से ही परिभाषित हैं।
सोरक

1

मामले में अगर दूसरों द्वारा प्रदान किए गए समाधान काम नहीं करते। फिर आपको पेरेंट और चाइल्ड टेबल्स के डेटाबेस इंजन की जाँच करने की कोशिश करनी चाहिए। मेरे मामले में, मेरे पास पैरेंट टेबल का इंजन "MyISAM" पर सेट था, इसे बदलने के लिए इसे InnoDB में बदल दिया।

आशा है कि यह दूसरों की मदद करता है जो मेरी तरह फंस गए हैं।


1

आपको डेटाबेस में एक कैस्केड के खिलाफ एक ऑनडेलेट फ़ील्ड नहीं डालना चाहिए।

इसलिए RESDICT के लिए onDelete फ़ील्ड सेट करें

सौभाग्य ♥


0

फिर भी एक और अजीब मामला जिसने मुझे यह त्रुटि दी। मैंने आईडी प्राथमिक कुंजी के लिए अपनी विदेशी कुंजियों को गलत तरीके से संदर्भित किया था। यह गलत परिवर्तन तालिका आदेशों के कारण हुआ था। मुझे यह पता INFORMATION_SCHEMA तालिका (इस स्टैकओवरफ़्लो उत्तर देखें) को क्वेरी करके मिला।

तालिका इतनी उलझी हुई थी कि इसे किसी भी वैकल्पिक आदेश द्वारा ठीक नहीं किया जा सकता था । मैंने अंत में तालिका को गिरा दिया और इसे फिर से संगठित किया। इससे सत्यनिष्ठा से छुटकारा मिल गया।


0

हो सकता है कि जब आप userIDकॉलम को जोड़ते हैं , तो उस निश्चित तालिका के लिए एक डेटा होता है जो इसे स्थापित किया जाता है, इसलिए इसका डिफ़ॉल्ट मान होगा0 , इसके बिना कॉलम को जोड़ने का प्रयास करेंNOT NULL


0

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

समस्या यह थी कि चाइल्ड टेबल की जगह पैरेंट टेबल पर विदेशी की कमी को परिभाषित किया गया था।


0

İ यदि आप mysql इंडेक्स या तालिकाओं के बीच संबंध का उपयोग करते हैं, तो सबसे पहले आप कॉलम्स को हटाते हैं (उदाहरण के लिए: city_id) और उसी नाम से नए कॉलम्स बनाएं (उदाहरण के लिए: city_id)। फिर से प्रयास करें ...


0

क्या कोई मौजूदा डेटा है जिसमें तालिका शामिल है? यदि हां, तो उस तालिका के सभी डेटा को खाली करने का प्रयास करें जिसे आप एक विदेशी कुंजी जोड़ना चाहते हैं। फिर कोड (एक विदेशी कुंजी जोड़ें) फिर से चलाएं।

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

आशा है कि यह काम करता है :)


0

तालिका 2 के UserID फ़ील्ड के अनुक्रमित हटाएं। यह मेरे लिए उपयुक्त है


0

वह त्रुटि तब होती है जब आप मूल तालिका के प्राथमिक कुंजी में मौजूद मानों के साथ एक विदेशी कुंजी जोड़ना चाहते हैं। आपको निश्चित होना चाहिए कि तालिका 2 में नई विदेशी कुंजी UserID में मान हैं जो तालिका 1 प्राथमिक कुंजी में मौजूद हैं, कभी-कभी डिफ़ॉल्ट रूप से यह शून्य या 0 के बराबर होता है।

आप तालिका 1 में प्राथमिक कुंजी में मौजूद मान के साथ तालिका 2 में विदेशी कुंजी के सभी क्षेत्रों को अपडेट कर सकते हैं।

update table2 set UserID = 1 where UserID is null

यदि आप अलग-अलग UserID जोड़ना चाहते हैं, तो आपको प्रत्येक पंक्ति को अपने इच्छित मानों के साथ संशोधित करना होगा।


-1

चाइल्ड टेबल विदेशी कुंजी बाधा विफल हो रही है

निम्नलिखित कारण से यह समस्या बढ़ सकती है:

यदि आप इसे स्प्रिंग mvc में कर रहे हैं, तो आपको आईडी प्रकार का स्पष्ट रूप से वर्णन करने की आवश्यकता है, क्योंकि कभी-कभी mysql आईडी के प्रकार को पहचानने में विफल रहता है। तो आप स्पष्ट रूप से अपनी इकाई वर्ग में दोनों तालिकाओं में सेट करें@GeneratedValue (strategy = GenerationType.IDENTITY)

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