2011-09-24 3 views
9

मेरे पास तीन तालिकाएं हैं: श्रेणियां, भाषाएं और श्रेणियां_भाषाएं। श्रेणियाँ_भाषाएं कई टेबलों में से कई हैं जो श्रेणियों और भाषाओं को एक साथ जोड़ती हैं। मैं टेबल भाषाओं में एक फ़ोरजिन कुंजी मान अपडेट करना चाहता हूं लेकिन यह मुझे त्रुटि # 1451 फेंकता है - मूल पंक्ति को हटा या अपडेट नहीं कर सकता: एक विदेशी कुंजी बाधा विफल हो जाती है!mysql डेटाबेस में विदेशी कुंजी मान को अद्यतन करने के लिए कैसे करें

CREATE TABLE IF NOT EXISTS `categories` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `name` varchar(20) NOT NULL, 
    `modified` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `languages` (
    `id` char(2) NOT NULL, 
    `name` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `categories_languages` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `category_id` int(11) unsigned NOT NULL, 
    `language_id` char(2) NOT NULL, 
    `translation` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_category_id_language_id` (`category_id`,`language_id`), 
    KEY `fk_language_id` (`language_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE; 

त्रुटि मुझे स्पष्ट है, लेकिन मैं इस मामले में एक महत्वपूर्ण मूल्य कैसे अपडेट कर सकता हूं? मैं UPDATA CASCADE पर जोड़ने की कोशिश की:

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

लेकिन यह भी संदेश के साथ विफल रहता है: MySQL ने कहा: प्रलेखन # 1005 - मेज './db_dodo/#sql-c2f_80e6f.frm' (errno: 121) बनाया नहीं जा सकता

+0

क्या अद्यतन क्वेरी आपको लगता है कि त्रुटि उत्पन्न द्वारा चलाए जा रहे है? – bobwienholt

उत्तर

40

आप अस्थायी रूप से विदेशी कुंजी की जाँच को निलंबित कर सकते हैं:

SET foreign_key_checks = 0; 
UPDATE languages SET id='xyz' WHERE id='abc'; 
UPDATE categories_languages SET language_id='xyz' WHERE language_id='abc'; 
SET foreign_key_checks = 1; 

संपादित: विदेशी कुंजी समस्या के लिए के रूप में: डेटा एक स्थानीय या एक दूरस्थ फाइल सिस्टम पर संग्रहीत किया जाता है? (रिमोट I/O त्रुटि) है। शायद लक्ष्य फ़ाइल सिस्टम पर अनुमति समस्याएं हैं या यह फ़ाइल नामों में # वर्ण का समर्थन नहीं करती है?

+0

हे धन्यवाद। इससे मदद मिली, मैं टेबल अपडेट करने में सक्षम था! अभी भी नहीं पता कि मैं अद्यतन कैस्केड बाधा को जोड़ने के लिए टेबल बाधाओं को बदलने में असमर्थ क्यों हूं ...? –

+1

आपको अपने संपादन के दौरान किसी अन्य सत्र से अमान्य प्रविष्टियों को रोकने के लिए पहले टेबल को लॉक करना चाहिए और उन्हें अनलॉक करना चाहिए। –

0

आप देख रहे हैं एक अस्थायी समाधान के लिए आप भी CASCADE को ON UPDATE कार्रवाई बदल सकते हैं और अपने आईडी संशोधित कर सकते हैं

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