फोर्स ड्रॉप mysql विदेशी कुंजी बाधा को दरकिनार


134

मैं एक को छोड़कर डेटाबेस से सभी तालिकाओं को हटाने की कोशिश कर रहा हूं, और मैं निम्नलिखित त्रुटि रखता हूं:

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

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

Google ने मुझे किसी ऐसी साइट पर लक्षित किया है जो निम्नलिखित विधि का सुझाव देती है:

mysql> SET foreign_key_checks = 0;
mysql> drop table ...
mysql> SET foreign_key_checks = 1;

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

डेटाबेस 4.1 है तो मैं उपयोग नहीं कर सकता DROP DATABASE

विचार?


1
आपने उस उत्तर को ही क्यों चुना जो आपके प्रश्न का हल प्रदान नहीं करता है?
संजय

जवाबों:


-40

चूंकि आप किसी भी डेटा को रखने में रुचि नहीं रखते हैं, पूरे डेटाबेस को छोड़ दें और एक नया बनाएं।


3
ओह मेरी, मुझे अब बहुत बेवकूफ लग रहा है, मैं डेटाबेस के वास्तविक नाम के साथ DATABASE शब्द को बाद में जोड़ने के बजाय प्रतिस्थापित कर रहा था, धन्यवाद दोनों +1
johnnyArt

13
इसका जवाब नहीं है
फ्रीलांसर

8
यह देखने के लिए प्रफुल्लित है कि इस उत्तर को
गुदगुदी

4
@RobertPounder जो वास्तव में मेरा उद्देश्य था, और जब से मैं इस साइट में शामिल हुआ हूं। मैं आपकी बात की सराहना करता हूं।
ओट्टोवियो डेसिओ

3
@RobertPounder SO, ओपी की मदद करने की तुलना में थोड़ा अधिक है, यह खोज योग्य है "कैसे" संसाधन के लिए, मैं इस विषय पर उतरा क्योंकि मुझे विदेशी प्रमुख बाधा जाँचों को अक्षम करने की आवश्यकता थी, और Google ने मुझे यहां पहुंचाया। मुझे खुशी है कि डेटाबेस को गिराना ओपी के लिए एक अच्छा समाधान था, लेकिन नीचे दिए गए जवाब वास्तव में "फोर्स ड्रॉप मायस्कल विदेशी कुंजी बाधा को रोकते हुए" प्रश्न के लिए सही है।
वैल रेडचेन्को

404

यह किसी खोज से यहां समाप्त होने वाले व्यक्ति के लिए उपयोगी हो सकता है। सुनिश्चित करें कि आप एक तालिका छोड़ने की कोशिश कर रहे हैं और एक दृश्य नहीं ।

SET विदेशी_का_चेक = 0;
- ड्रॉप टेबल
ड्रॉप तालिका ...
- विचार छोड़ें
ड्रॉप व्यू ...
SET विदेशी_की_चेक = 1;

SET foreign_key_checks = 0विदेशी कुंजी जाँचों को बंद करना है और फिर SET foreign_key_checks = 1विदेशी कुंजी जाँचों को वापस सेट करना है। जबकि चेक बंद टेबल को गिराया जा सकता है, टेबल की संरचना की अखंडता को बनाए रखने के लिए चेक को फिर से चालू किया जाता है।


43
PAT मेरा दोस्त है!
सीनडाउन

5
यह एक बेहतर सही उत्तर है। समस्या को हल करता है कि क्या सभी तालिकाओं को हटाना, या बस कुछ। बहुत खूब!
ल्यूक स्टीवेन्सन

@PAT आपका बहुत बहुत धन्यवाद, इसने काम किया। हालांकि यह माईस्क्ल क्वेरी ब्राउज़र में काम नहीं कर सका। आपने मेरा दिन बचाया।
मेमन

पूरी तरह से काम किया, मैंने इसका इस्तेमाल किया क्योंकि मैं पूरे डेटाबेस को नहीं गिरा सकता
पाब्लो पज़ोस

1
मैं मानता हूं कि यह आम तौर पर सही समाधान है, लेकिन @ जॉनीअर्ट, जिन्होंने सवाल पूछा, विशेष रूप से इसे एक व्यवहार्य विकल्प के रूप में बाहर रखा क्योंकि यह उनके लिए काम नहीं करता था। तो ऐसा लगता है कि यह मूल प्रश्न का सही उत्तर नहीं है, क्या यह है?
डेविड

18

अगर आप phpmyadmin का उपयोग कर रहे हैं तो यह सुविधा पहले से ही है।

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

3
आपने मेरा दिन बचाया! धन्यवाद! एक जादू की तरह काम किया!
कामी

4

आप निम्न चरणों का उपयोग कर सकते हैं, मेरे लिए बाधा के साथ तालिका को छोड़ने के लिए काम किया, समाधान पहले से ही उपरोक्त टिप्पणी में समझाया गया है, मैंने इसके लिए सिर्फ स्क्रीन शॉट जोड़ा है -यहाँ छवि विवरण दर्ज करें


यह उच्चतम मतदान वाले उत्तर का एक डुप्लिकेट है, जिसे चार साल पहले पोस्ट किया गया था।
चब जूल

3

ड्रॉप डेटाबेस MySQL के सभी संस्करणों में मौजूद है। लेकिन अगर आप तालिका संरचना को रखना चाहते हैं, तो यहां एक विचार है

mysqldump --no-data --add-drop-database --add-drop -hhSTSTNAME -uUSERNAME -p> dip.sql

यह एक कार्यक्रम है, न कि एक mysql कमांड

फिर, mysql में लॉग इन करें और

source dip.sql;


1

टर्मिनल से एक बार में सभी तालिका को छोड़ने का सरल उपाय।

इसमें आपके mysql शेल (हालांकि एक कदम समाधान नहीं) के अंदर कुछ चरण शामिल थे, इसने मुझे काम किया और मेरा दिन बचाया।

सर्वर संस्करण के लिए काम किया: 5.6.38 MySQL सामुदायिक सर्वर (GPL)

मेरे द्वारा अनुसरण किए गए चरण:

 1. generate drop query using concat and group_concat.
 2. use database
 3. turn off / disable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 0;), 
 4. copy the query generated from step 1
 5. re enable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 1;)
 6. run show table

MySQL शेल

$ mysql -u root -p
Enter password: ****** (your mysql root password)
mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

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