2012-06-19 18 views
32

विफल हो गई है MySQL में मैं एक टेबल छोड़ना चाहता हूं।
मैंने बहुत सी चीजों की कोशिश की लेकिन मुझे त्रुटि मिल रही है कि bericht नाम की तालिका को हटाया नहीं जा सकता है। एक विदेशी कुंजी बाधा में विफल रहता हैतालिका ड्रॉप नहीं कर सकता: एक विदेशी कुंजी बाधा

मैं इस तालिका ड्रॉप कैसे करूँ: - हटाने के लिए या एक माता पिता पंक्ति अद्यतन नहीं कर सकते

# 1217: यह त्रुटि मैं हो रही है?

+2

पता लगाएं कि कौन सी तालिका विदेशी कुंजी के माध्यम से संदर्भित कर रही है, और पहले उस तालिका पर एफके बाधा ड्रॉप करें, फिर इस तालिका को छोड़ दें। –

+0

आपको उस अन्य टेबल द्वारा आवश्यकता को हटाने की आवश्यकता है जिसे आप नहीं चाहते हैं – BugFinder

+1

क्या इनमें से कोई भी उत्तर आपकी मदद करता है? http://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails http://stackoverflow.com/प्रश्न/3334619/ए-पैरेंट-पंक्ति-ए-विदेशी-कुंजी-बाधा-विफल नहीं हो सकता है –

उत्तर

6

उपयोग show create table tbl_name विदेशी कुंजी

आप एक विदेशी कुंजी ड्रॉप करने के लिए इस वाक्य विन्यास का उपयोग कर सकते हैं देखने के लिए यहाँ

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol

वहाँ भी अधिक जानकारी है (फ्रैंक Vanderhallen पोस्ट देखें): http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

44

इसे आजमाएं:

SELECT * 
FROM information_schema.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_NAME = 'YourTable'; 

यह आपको वितरित करना चाहिए जो टेबल्स तालिका आप, छोड़ एक बार आप इन संदर्भों, या डेटासेट जो संदर्भ डेटासेट इस तालिका में ड्रॉप आप तालिका

+4

यह समाधान बेहतर तरीका है। यह सुरक्षित है और यह चयनित उत्तर की तरह बुरा अभ्यास नहीं है। – Sloganho

+1

यह मेरे लिए काम करता है, यह उत्तर स्वीकार किए जाने के रूप में चिह्नित किया जाना चाहिए। – parvez

68

यह करना चाहिए ड्रॉप करने में सक्षम हो जाएगा चाहते हैं के लिए संदर्भ है चाल:

SET FOREIGN_KEY_CHECKS=0; DROP TABLE bericht; SET FOREIGN_KEY_CHECKS=1; 

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

#1217 त्रुटि तब होती है जब अन्य तालिकाओं में उस तालिका में विदेशी कुंजी बाधाएं होती हैं जिन्हें आप हटाने की कोशिश कर रहे हैं और आप इनो डीबी डेटाबेस इंजन का उपयोग कर रहे हैं। यह समाधान अस्थायी रूप से संयम की जांच अक्षम करता है और फिर उन्हें पुनः सक्षम करता है। अधिक के लिए documentation पढ़ें। bericht के आधार पर तालिका में विदेशी कुंजी संयम और फ़ील्ड को हटाना सुनिश्चित करें, अन्यथा आप अपने डेटाबेस को टूटी हुई स्थिति में छोड़ सकते हैं।

+2

यह उत्तर – kyeno

+0

का चयन किया जाना चाहिए अब तक यह सबसे अच्छा जवाब है और शीर्ष पर होना चाहिए !!!!!! –

+1

हालांकि यह सही है, यह करने के लिए यह एक अद्भुत बीएडी अभ्यास है। जैसा कि कई उपयोगकर्ताओं (रूने कागार्ड समेत) द्वारा इंगित किया गया था, आपको संदर्भों को ढूंढना, विश्लेषण करना और उन्हें आवश्यकतानुसार छोड़ना चाहिए। – zozo

1

यह शायद अन्य स्कीमा के लिए एक ही तालिका है जिसके कारण आपको यह त्रुटि मिल रही है।

आपको पहले मूल पंक्ति को मूल पंक्ति को छोड़ने की आवश्यकता है।

0

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

मूल रूप से, अपनी मेज इसलिए की तरह बदला जाना चाहिए:

ALTER TABLE 'bericht' DROP FOREIGN KEY 'your_foreign_key';

ALTER TABLE 'bericht' ADD CONSTRAINT 'your_foreign_key' FOREIGN KEY ('column_foreign_key') REFERENCES 'other_table' ('column_parent_key') ON UPDATE CASCADE ON DELETE SET NULL;

व्यक्तिगत तौर पर मैं से बचने के लिए का उपयोग कर दोनों "अद्यतन CASCADE ऑन" के साथ ही सिफारिश करेंगे "चालू हटाना SET नल" अनावश्यक जटिलताओं, हालांकि आपका सेट अप एक अलग दृष्टिकोण को निर्देशित कर सकता है।

उम्मीद है कि इससे मदद मिलती है।

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