2012-10-19 12 views
12

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

मेरे पास MySQL में InnoDB उपयोगकर्ता तालिका का एक सेट है जो विदेशी कुंजी के माध्यम से एक साथ बंधे हैं; माता-पिता user तालिका, और ईमेल पते, क्रियाएं इत्यादि स्टोर करने वाली बाल सारणी का एक सेट। ये सभी माता-पिता user तालिका से विदेशी कुंजी, uid से बंधे हैं, सभी माता-पिता और बाल कुंजी int(10) हैं।

बच्चे तालिकाओं के सभी एक विदेशी कुंजी बाधा user.uid की ओर इशारा करते के साथ एक uid मूल्य है, और ON DELETE CASCADE और ON UPDATE CASCADE करने के लिए सेट।

जब मैं user से उपयोगकर्ता को हटाता हूं, तो सभी बच्चे को बाधित प्रविष्टियां हटा दी जाती हैं। हालांकि, जब मैं एक user.uid मूल्य अद्यतन करने का प्रयास है, यह निम्न त्रुटि में परिणाम है, बल्कि बच्चे तालिकाओं के लिए uid परिवर्तन व्यापक की तुलना में:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`accounts`.`user_email`, CONSTRAINT `user_email_ibfk_2` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE) 

मुझे लगता है मैं यहाँ कुछ स्पष्ट याद आ रही किया जाना चाहिए है। user_email के साथ कुंजी बाधा को हटाने और user में मान को अपडेट करने का प्रयास उसी त्रुटि में होता है लेकिन अगले वर्णमाला user बच्चे तालिका के लिए, इसलिए मुझे विश्वास नहीं है कि यह एक तालिका-विशिष्ट त्रुटि है।

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

SHOW ENGINE INNODB STATUS से परिणामों में जोड़ना:

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
121018 22:35:41 Transaction: 
TRANSACTION 0 5564387, ACTIVE 0 sec, process no 1619, OS thread id 2957499248 updating or deleting, thread declared inside InnoDB 499 
mysql tables in use 1, locked 1 
17 lock struct(s), heap size 2496, 9 row lock(s), undo log entries 2 
MySQL thread id 3435659, query id 24068634 localhost root Updating 
UPDATE `accounts`.`user` SET `uid` = '1' WHERE `user`.`uid` = 306 
Foreign key constraint fails for table `accounts`.`user_email`: 
, 
    CONSTRAINT `user_email_ibfk_2` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE 
Trying to add in child table, in index `uid` tuple: 
DATA TUPLE: 2 fields; 
... 
A bunch of hex code 

But in parent table `accounts`.`user`, in index `PRIMARY`, 
the closest match we can find is record: 
... 
A bunch of hex code 
+0

'इंजन इंजन INNODB स्थिति दिखाएं –

+0

इसके बजाय इसे डीबीए में स्थानांतरित करने के लिए वोटिंग। –

उत्तर

1

एक असंबंधित काम पर, मैं हाल ही में हमारे MySQL डेटाबेस MySQL Workbench में लाया है, और जब ऊपर तालिकाओं के लिए तालिका संबंधों को देखने, मैं 'डुप्लीकेट' और/या नकली संबंधों है कि मैं किसी भी तरह से पहले छूट गए थे देखा (वे नहीं थे PHPMyAdmin FWIW में दिखाई नहीं दे रहा है)। इन अतिरिक्त संबंधों को हटाने से तुरंत इस मुद्दे को मंजूरी मिली।

8

जब से तुम मेज परिभाषाएँ नहीं दिया है, उसका अनुमान लगाना मुश्किल है। लेकिन ऐसा लगता है कि आप बच्चे की मेज में विदेशी कुंजी को संशोधित करने का प्रयास कर रहे हैं। AFAIK, यह अवैध है, आप इसे माता-पिता से संशोधित कर सकते हैं, लेकिन बाल तालिका नहीं।

CREATE TABLE parent (
    parent_id INT NOT NULL, 
    parent_data int, 

    PRIMARY KEY (parent_id) 
) ENGINE=INNODB; 

CREATE TABLE child1 (
    child1_id INT, 
    child1_data INT, 
    fk_parent_id INT, 

    INDEX par_ind1 (fk_parent_id), 

    FOREIGN KEY (fk_parent_id) 
    REFERENCES parent(parent_id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) ENGINE=INNODB; 

CREATE TABLE child2 (
    child2_id INT, 
    child2_data INT, 
    fk_parent_id INT, 

    INDEX par_ind2 (fk_parent_id), 

    FOREIGN KEY (fk_parent_id) 
    REFERENCES parent(parent_id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) ENGINE=INNODB; 

INSERT INTO parent 
    (parent_id, parent_data) 
    VALUES 
    (1, 11), 
    (2, 12); 

INSERT INTO child1 
    (child1_id, child1_data, fk_parent_id) 
    VALUES 
    (101, 1001, 1), 
    (102, 1002, 1), 
    (103, 1003, 1), 
    (104, 1004, 2), 
    (105, 1005, 2); 

INSERT INTO child2 
    (child2_id, child2_data, fk_parent_id) 
    VALUES 
    (106, 1006, 1), 
    (107, 1007, 1), 
    (108, 1008, 1), 
    (109, 1009, 2), 
    (110, 1010, 2); 

फिर इस अनुमति दी है:

इस उदाहरण पर विचार

UPDATE parent 
    SET parent_id = 3 WHERE parent_id = 2; 

SELECT * FROM parent; 
SELECT * FROM child1; 
SELECT * FROM child2; 

लेकिन यह नहीं है, क्योंकि यह बच्चे मेज से माता-पिता FK को संशोधित करता है:

UPDATE child1 
    SET fk_parent_id = 4 WHERE fk_parent_id = 1; 

यह आपकी त्रुटि के समान त्रुटि प्राप्त करता है:

Cannot add or update a child row: a foreign key constraint fails (`db_2_b43a7`.`child1`, CONSTRAINT `child1_ibfk_1` FOREIGN KEY (`fk_parent_id`) REFERENCES `parent` (`parent_id`) ON DELETE CASCADE ON UPDATE CASCADE): 
+0

धन्यवाद। मैं अभिभावक तालिका अपडेट कर रहा हूं - मैंने पोस्ट किए गए डंप से क्वेरी देखें: 'अद्यतन \ 'खाते \'। \ 'उपयोगकर्ता \' सेट \ 'uid \' =' 1 'जहां \ 'उपयोगकर्ता \'। \ U uid \ '= 306'। 'उपयोगकर्ता' मूल तालिका है, और इस त्रुटि को ट्रिगर करता है। –

+0

क्या आप अपनी स्कीमा के बारे में अधिक जानकारी पोस्ट कर सकते हैं? या उपरोक्त उदाहरण को संशोधित करें ताकि आपको वही त्रुटि मिल सके? – walrii

4

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

-1

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

9

मैं अपने एसक्यूएल कोड के शुरू करने के लिए निम्न कोड जोड़कर मुद्दों 'विदेशी कुंजी बाधा विफल रहता है' हल

SET @[email protected]@CHARACTER_SET_CLIENT; 
SET @[email protected]@CHARACTER_SET_RESULTS; 
SET @[email protected]@COLLATION_CONNECTION; 
SET NAMES utf8; 
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO'; 
SET @[email protected]@SQL_NOTES, SQL_NOTES=0; 

तब के लिए इस कोड को जोड़ने (यह एक मेज पर मूल्यों आयात करने के लिए किया गया था)

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 
SET [email protected]_CHARACTER_SET_CLIENT; 
SET [email protected]_CHARACTER_SET_RESULTS; 
SET [email protected]_COLLATION_CONNECTION; 
SET [email protected]_SQL_NOTES; 
+0

खूबसूरती से काम करता है –

+0

यह काम करता है !!! धन्यवाद – tiveor

+0

जीवन बचाओ आदमी, धन्यवाद –

0

अद्यतन पर इस तरह के एक त्रुटि वर्ण सेट और मिलान में अंतर के कारण हो सकता फ़ाइल के अंत इतना यकीन है कि वे दोनों तालिकाओं के लिए एक ही है।

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