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


132

मैंने नीचे दिखाए गए अनुसार MySQL कार्यक्षेत्र में तालिकाओं का निर्माण किया है:

आदेश तालिका:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

उत्पादन तालिका:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

और ORDRELINJE तालिका:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

इसलिए जब मैं ORDRELINJEतालिका में मूल्य डालने की कोशिश करता हूं तो मुझे यह मिलता है:

त्रुटि कोड: 1452। चाइल्ड रो को जोड़ या अपडेट नहीं किया जा सकता: एक विदेशी कुंजी बाधा विफल रहती है ( srdjank! Ordrelinje, CONSTRAINT Ordrelinje_fkFOREIGN KEY ( Ordre) REFERENCES Ordre( OrdreID))

मैंने इस विषय पर अन्य पोस्ट देखी हैं, लेकिन कोई भाग्य नहीं। क्या मैं किसी चीज या किसी विचार की देखरेख कर रहा हूं?


जवाबों:


172

से लिया गया FOREIGN KEY बाधाओं का उपयोग करने

विदेशी कुंजी रिश्तों में एक मूल तालिका शामिल होती है जो केंद्रीय डेटा मान रखती है, और एक समान तालिका वाला बच्चा तालिका अपने माता-पिता को वापस इंगित करता है। FOREIGN KEY क्लॉज चाइल्ड टेबल में निर्दिष्ट है।

यह किसी भी INSERT या UPDATE ऑपरेशन को अस्वीकार कर देगा, जो कि चाइल्ड टेबल में एक विदेशी कुंजी मान बनाने का प्रयास करता है, यदि पैरेंट टेबल में कोई मिलान उम्मीदवार कुंजी मूल्य नहीं है।

तो आपकी त्रुटि Error Code: 1452. Cannot add or update a child row: a foreign key constraint failsअनिवार्य रूप से इसका मतलब है कि, आप अपनी Ordrelinjeतालिका में एक पंक्ति जोड़ने की कोशिश कर रहे हैं जिसके लिए कोई मिलान पंक्ति (ऑर्डरआईडी) Ordreतालिका में मौजूद नहीं है ।

आपको पहले अपनी Ordreतालिका में पंक्ति सम्मिलित करनी होगी ।


या फिर हम डेटा की प्रविष्टि के बाद विदेशी कुंजी को जोड़ सकते हैं?
वामसी पावन महेश

@VamsiPavanMahesh, NO, भले ही आप ऐसा करें; जब भी कुंजी डेटा बेमेल होगा, तब तक आपका सबसे महत्वपूर्ण कुंजी निर्माण उसी तरह की त्रुटि के साथ विफल होगा।
राहुल

4
सीधे शब्दों में कहें तो अगर बच्चों के माता-पिता को परिभाषित किया गया है, तो इन माता-पिता का अस्तित्व है। और मुझे लगा कि मेरा सिंटैक्स गलत था ... इससे मुझे बहुत मदद मिली। धन्यवाद!
wst

2
वैकल्पिक संबंधों के बारे में क्या?
हमीद

40

आपको यह बाधा जाँच मिल रही है क्योंकि Ordreतालिका में संदर्भ नहीं हैOrdreID में इन्सर्ट कमांड उपलब्ध ।

में मूल्य डालने के लिए Ordrelinje, आपको पहले Ordreतालिका में मूल्य दर्ज करना होगा और उसी OrdreIDमें उपयोग करना होगाOrderlinje तालिका ।

या आप अशक्त बाधा को दूर नहीं कर सकते हैं और इसमें एक पूर्ण मान सम्मिलित कर सकते हैं।


29

आपको चाइल्ड टेबल में डेटा डिलीट करना चाहिए, जिसमें पैरेंट टेबल प्राइमरी की के लिए कोई भी समान विदेशी की वैल्यू नहीं है। चाइल्ड टेबल से सभी डेटा को डिलीट कर दें और फिर पेरेंट टेबल में प्राइमरी चाबी की तरह ही फॉरेन की-वैल्यू वाला नया डेटा डालें। । वह काम करना चाहिए। यहाँ भी एक यूट्यूब वीडियो है


1
यह सही है, डेटा को पिवट टेबल में डालने से पहले (जिसमें CASCADE अड़चनें हैं), आपको पेरेंट टेबल में डेटा डालना होगा। जैसे 1 टेबल - अनुमतियाँ; दूसरी तालिका - भूमिकाएं; तीसरी तालिका - अनुमति_प्रवृत्त; तो 1 परमिशन टेबल में इन्सर्ट करें, 2 रोल्स टेबल में डालें और आखिरी में परमिशन_रोले टेबल में डालें।
दीपक पंवार

24

समस्या प्रमुख कुंजी बाधा के साथ है। डिफ़ॉल्ट रूप से (SET FOREIGN_KEY_CHECKS = 1)। FOREIGN_KEY_CHECKS विकल्प निर्दिष्ट करता है कि क्या InnoDB तालिकाओं के लिए विदेशी कुंजी बाधाओं की जाँच करें या नहीं। MySQL - FOREIGN_KEY_CHECKS सेट करें

हम क्वेरी चलाने से पहले अक्षम के रूप में विदेशी कुंजी जांच सेट कर सकते हैं। विदेशी कुंजी अक्षम करें

अपनी क्वेरी चलाने से पहले इनमें से किसी एक पंक्ति को निष्पादित करें, फिर आप अपनी क्वेरी को सफलतापूर्वक चला सकते हैं। :)

1) सत्र के लिए (अनुशंसित)

SET FOREIGN_KEY_CHECKS=0;

2) विश्व स्तर पर

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

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

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

अब, हम Left Joinचाइल्ड टेबल में उन सभी पंक्तियों को खोजने के लिए उपयोग कर सकते हैं , जिनके पैरेंट टेबल में मैचिंग मान नहीं हैं। निम्नलिखित क्वेरी उन गैर-मिलान पंक्तियों को लाने में सहायक होगी:

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

अब, आप आम तौर पर डेटा को ठीक करने के लिए निम्न चरणों में से एक (या अधिक) कर सकते हैं।

  1. आपके "व्यावसायिक तर्क" के आधार पर, आपको मूल तालिका में मौजूदा मानों के साथ इन बेजोड़ मूल्य को अपडेट / मिलान करना होगा। आपको कभी-कभी उन्हें सेट करने की आवश्यकता हो सकती हैnull
  2. बेजोड़ मूल्यों वाले इन पंक्तियों को हटा दें।
  3. अपनी मूल तालिका में नई पंक्तियाँ जोड़ें, जो बाल तालिका में बेजोड़ मूल्यों के अनुरूप है।

एक बार डेटा तय हो जाने के बाद, हम ALTER TABLEसिंटैक्स का उपयोग करके विदेशी कुंजी बाधा को लागू कर सकते हैं ।


मैं तालिका से सभी डेटा को हटाता हूं और फिर विदेशी कुंजी जोड़ देता हूं। धन्यवाद
सुमित कुमार गुप्ता

4

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


3

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

मेरे लिए जो काम किया वह कोड "SET GLOBAL FOREIGN_KEY_CHECKS = 0" टाइप कर रहा था। उसके बाद मैंने MySQL से बाहर बंद कर दिया और फिर इसे पुनः आरंभ किया और मैं अपने सभी डेटा को बिना किसी त्रुटि के अपलोड करने में सक्षम था। फिर मैंने सिस्टम को सामान्य पर वापस सेट करने के लिए "SET GLOBAL FOREIGN_KEY_CHECKS = 1" टाइप किया, हालांकि मुझे पूरी तरह से यकीन नहीं है कि FOREIGN_KEY_CHECKS क्या करता है। उम्मीद है की यह मदद करेगा!


क्या यह सिर्फ @ मिस्टर-फैजान द्वारा पोस्ट किए गए जवाब में पहले से ही सुझाया नहीं गया है? यदि नहीं, तो कृपया बताएं कि आपका उत्तर क्या कहता है।
एड्रियन मोल

2

यह पहले अभिभावक तालिका में संबंधित रिकॉर्ड सम्मिलित करके तय किया जा सकता है और फिर हम चाइल्ड टेबल के संबंधित कॉलम में रिकॉर्ड डाल सकते हैं। कॉलम का डेटा प्रकार और आकार भी जांचें। यह मूल तालिका स्तंभ के समान होना चाहिए, यहां तक ​​कि इंजन और टकराव भी समान होना चाहिए। इसे इस्तेमाल करे! इसी से मैंने अपना हल निकाला। गलत होने पर मुझे सुधारो।


1

आपकी ORDRELINJEतालिका ORDERकिसी विदेशी कुंजी बाधा का उपयोग करके तालिका के साथ जुड़ी हुई constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)है, जिसके अनुसार Ordre int NOT NULL,तालिका के स्तंभ को तालिका के ORDRELINJEकिसी भी Ordre int NOT NULL,स्तंभ से मेल खाना चाहिए ORDER

अब यहां क्या हो रहा है, जब आप नई पंक्ति को ORDRELINJEतालिका में सम्मिलित कर रहे हैं, तो fk बाधा के अनुसार Ordrelinje_fkयह ORDERतालिका की जाँच कर रहा है यदिOrdreID मौजूद है या नहीं और जैसा कि यह किसी आर्डरआईड के साथ मेल नहीं खा रहा है, कम्पाइलर विदेशी कुंजी उल्लंघन की शिकायत कर रहा है। यही कारण है कि आपको यह त्रुटि मिल रही है।

विदेशी कुंजी अन्य तालिका की प्राथमिक कुंजी है जिसे आप दोनों के बीच लिंक करने के लिए किसी भी तालिका में उपयोग करते हैं। यह कुंजी विदेशी कुंजी बाधा से बाध्य है जिसे आप तालिका बनाते समय निर्दिष्ट करते हैं। डेटा पर कोई भी ऑपरेशन इस बाधा का उल्लंघन नहीं करना चाहिए। इस बाधा के उल्लंघन के परिणामस्वरूप इस तरह की त्रुटियां हो सकती हैं।

आशा है कि मैंने इसे स्पष्ट कर दिया है।


1

विदेशी कुंजी विशेषता मान सम्मिलित करते समय, पहले विशेषता प्रकार, साथ ही मूल संबंध में प्राथमिक कुंजी विशेषता मान सत्यापित करें, यदि माता-पिता संबंध में मान मेल खाते हैं, तो आप आसानी से बाल विशेषता मान सम्मिलित / अपडेट कर सकते हैं।


1

आपको CHILD टेबल में प्राथमिक कुंजी के संदर्भ में संदर्भ कुंजी से डेटा जोड़ना चाहिए
इसका मतलब यह है कि विदेशी कुंजी में यादृच्छिक डेटा न जोड़ें use प्राथमिक पहुंच से डेटा का उपयोग करें जो पहुंच योग्य है

विदेशी कुंजी में डेटा का वर्णन


1

इससे @ Mr-Faizan और अन्य उत्तरों को पढ़ने के बाद मुझे मदद मिली।

'विदेशी कुंजी जांच सक्षम करें' को अनटिक करें

phpMyAdmin में और क्वेरी को हिट करें। मैं WorkBench के बारे में नहीं जानता, लेकिन अन्य उत्तर आपकी मदद कर सकते हैं।


0

आपको प्रत्येक तालिकाओं में कम से कम एक कच्चा डालना चाहिए (जिन्हें आप विदेशी कुंजियों को इंगित करना चाहते हैं) फिर आप विदेशी कुंजियों के मूल्यों को सम्मिलित या अद्यतन कर सकते हैं।


0

बीमार इसे यहाँ में निचोड़ें: मेरा मामला एक पोस्ट के लिए एक तरह से बनाने की कोशिश कर रहा था जो कि मौजूद नहीं है; डेटाबेस में कमी करते हुए त्रुटि को उठाया गया था। समाधान पहले पोस्ट को बनाना था फिर इसे पसंद करना। मेरी समझ से अगर post_id को पसंद तालिका में सहेजा जाना था तो उसे अस्तित्व का पता लगाने के लिए पहले पोस्ट टेबल के साथ जांच करनी थी। मुझे यह बेहतर लगा कि इस तरह से यह मेरे लिए इस तरह से अधिक तार्किक है।


0

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

उदाहरण के लिए, यदि आप टेबल 2 से टेबल 1 (userid, password)में जोड़ रहे हैं तो टेबल 2 ऑर्डर से समान होना चाहिए और जहां पसंद नहीं है(userid, password) (password,userid)userid है विदेशी कुंजी में table2 के table1


0

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

चाइल्ड टेबल से सभी डेटा को हटाने की कोशिश करें, फिर विदेशी कुंजी सेट करें और बाद में टेबल में डेटा जोड़ें / डालें, यह काम करेगा।


0

नहीं की जाँच करें। पैरेंट टेबल का रिकॉर्ड जो चाइल्ड टेबल के साथ मेल खाता है और प्राथमिक कुंजी विदेशी कुंजी संदर्भ के साथ मेल खाना चाहिए। यह मेरे लिए काम करता है।


-4

इसके 100% काम ...

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

(और संदर्भ विदेशी बाधा हटाएं)

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