บังคับให้ mysql ลดลงโดยข้ามข้อ จำกัด ของคีย์ต่างประเทศ


139

ฉันพยายามลบตารางทั้งหมดออกจากฐานข้อมูลยกเว้นตารางเดียวและพบข้อผิดพลาดต่อไปนี้:

ไม่สามารถลบหรืออัปเดตแถวหลัก: ข้อ จำกัด ของคีย์นอกระบบล้มเหลว

แน่นอนว่าฉันสามารถลองผิดลองถูกเพื่อดูว่าข้อ จำกัด สำคัญเหล่านั้นคืออะไรและในที่สุดก็ลบตารางทั้งหมด แต่ฉันอยากรู้ว่ามีวิธีที่รวดเร็วในการบังคับให้วางตารางทั้งหมดหรือไม่ (ฉันจะสามารถแทรกใหม่ได้ ไม่ต้องการลบ)

Google เล็งฉันไปที่ไซต์บางแห่งที่แนะนำวิธีการต่อไปนี้:

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

คำตอบสั้น ๆ คือมันไม่ได้ทำเคล็ดลับจริงๆเนื่องจากฉันได้รับข้อผิดพลาดเดียวกันในขณะที่ฉันสามารถลบตารางเพิ่มเติมได้ ฉันเคยเห็นวิธี Stack Overflow ในการรับคีย์ต่างประเทศทั้งหมดที่เชื่อมโยงกับตารางบางตาราง แต่นั่นเป็นวิธีที่ใช้เวลานานเกินไปเว้นแต่ฉันจะเขียนสคริปต์ทั้งหมด (ซึ่งทำได้ในกรณีที่ไม่มีตัวเลือกอื่น)

ฐานข้อมูลคือ 4.1 ดังนั้นฉันจึงใช้ไม่ได้ DROP DATABASE

ไอเดีย?


1
เหตุใดคุณจึงเลือกคำตอบตามที่เลือกไว้ซึ่งไม่สามารถตอบคำถามของคุณได้
Sanjay

คำตอบ:


-45

เนื่องจากคุณไม่สนใจที่จะเก็บรักษาข้อมูลใด ๆ ให้วางฐานข้อมูลทั้งหมดแล้วสร้างใหม่


3
โอ้ฉันรู้สึกโง่มากตอนนี้ฉันแทนที่คำว่า DATABASE ด้วยชื่อจริงของฐานข้อมูลแทนที่จะเพิ่มในภายหลังขอบคุณทั้ง +1
johnnyArt

13
นี่ไม่ใช่คำตอบ
Freelancer

3
เป็นคำตอบที่ถูกต้องสำหรับคำถามฉันไม่เข้าใจการโหวตลงเป็นการส่วนตัว OP ต้องการลบฐานข้อมูลไม่รู้วิธีและกำลังสร้างทางเลือกอื่น คำตอบนี้ตอบคำถามเดิมของ OP ที่เขาหลงทางในการพยายามแก้ไข สิ่งนี้เน้นย้ำโดยข้อเท็จจริงที่ OP ยอมรับคำตอบนี้
Robert Pounder

4
@RobertPounder นั่นคือวัตถุประสงค์ของฉันและนับตั้งแต่ฉันเข้าร่วมไซต์นี้ ฉันขอขอบคุณในมุมมองของคุณ
OtávioDécio

3
@RobertPounder SO เป็นมากกว่าแค่การช่วยเหลือ OP เท่านั้น แต่เป็นทรัพยากร "วิธีการ" ที่ค้นหาได้ฉันเข้ามาในหัวข้อนี้เพราะฉันต้องการปิดใช้งานการตรวจสอบข้อ จำกัด ของคีย์ต่างประเทศและ Google ก็พาฉันมาที่นี่ ฉันมีความสุขกับการทิ้งฐานข้อมูลเป็นวิธีแก้ปัญหาที่ดีสำหรับ OP แต่คำตอบด้านล่างนี้ถูกต้องสำหรับคำถาม "Force drop mysql ข้ามข้อ จำกัด ของคีย์ต่างประเทศ"
Val Redchenko

419

สิ่งนี้อาจเป็นประโยชน์สำหรับผู้ที่มาจากการค้นหาที่นี่ ให้แน่ใจว่าคุณกำลังพยายามที่จะวางโต๊ะและไม่ได้เป็นมุมมอง

ตั้งค่า Foreign_key_checks = 0;
- วางตาราง
วางโต๊ะ ...
- ลดมุมมอง
มุมมองแบบเลื่อน ...
SET Foreign_key_checks = 1;

SET foreign_key_checks = 0คือการตั้งค่าการตรวจสอบคีย์ต่างประเทศเป็นปิดจากนั้นSET foreign_key_checks = 1คือการตั้งค่าการตรวจสอบคีย์ต่างประเทศอีกครั้ง ในขณะที่การตรวจสอบไม่อยู่ในตารางสามารถหลุดได้การตรวจสอบจะเปิดขึ้นอีกครั้งเพื่อรักษาความสมบูรณ์ของโครงสร้างตาราง


5
นี่คือคำตอบที่ถูกต้องดีกว่า แก้ปัญหาไม่ว่าจะลบตารางทั้งหมดหรือเพียงไม่กี่ตาราง ยอดเยี่ยมมาก!
Luke Stevenson

@PAT ขอบคุณมากมันได้ผล แม้ว่าจะไม่สามารถทำงานในเบราว์เซอร์ Mysql Query คุณช่วยวันของฉัน
58

ทำงานได้อย่างสมบูรณ์ฉันใช้สิ่งนี้เพราะฉันไม่สามารถวางฐานข้อมูลทั้งหมดได้
Pablo Pazos

1
ฉันยอมรับว่าปกติแล้วนี่เป็นวิธีแก้ปัญหาที่ถูกต้อง แต่ @johnnyArt ซึ่งเป็นผู้ถามคำถามนี้ได้ยกเว้นสิ่งนี้ไว้เป็นตัวเลือกที่ใช้ได้ผลเพราะมันไม่ได้ผลสำหรับเขา ดูเหมือนว่านี่จะไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามเดิมใช่หรือไม่?
เดวิด

คำตอบนี้เหมาะสมถูกต้องและช่วยให้ฉันแก้ไขความยุ่งยากได้อย่างไรก็ตามสิ่งสำคัญคือต้องทราบว่ามีตัวแปร Foreign_key_checks สองตัวแปร ได้แก่ ตัวแปรส่วนกลางและตัวแปรภายใน (ต่อเซสชัน) คำสั่ง SET Foreign_key_checks แก้ไขตัวแปรเซสชันในขณะที่ SET GLOBAL Foreign_key_checks แก้ไขตัวแปรโกลบอล หรือคุณสามารถใช้ ALTER TABLE table_name DISABLE KEYS เพื่อปิดใช้งาน FK ชั่วคราว เปิดใช้งานอีกครั้งโดยใช้ ALTER TABLE table_name ENABLE KEYS - tableplus.com/blog/2018/08/…
Dimgba Kalu

19

หากคุณใช้phpmyadmin แสดงว่าคุณสมบัตินี้มีอยู่แล้ว

  • เลือกตารางที่คุณต้องการวาง
  • จากรายการแบบหล่นลงที่ด้านล่างของรายการตารางให้เลือกวาง
  • หน้าใหม่จะเปิดขึ้นโดยมีช่องทำเครื่องหมายที่ด้านล่างว่า "Foreign key check" ให้ยกเลิกการเลือก
  • ยืนยันการลบโดยยอมรับว่า "ใช่"

4

คุณสามารถใช้ขั้นตอนต่อไปนี้ได้ผลสำหรับฉันในการวางตารางด้วยข้อ จำกัด วิธีแก้ปัญหาที่อธิบายไว้แล้วในความคิดเห็นด้านบนฉันเพิ่งเพิ่มภาพหน้าจอสำหรับสิ่งนั้น -ป้อนคำอธิบายภาพที่นี่


คำตอบนี้ซ้ำกับคำตอบที่ได้รับการโหวตสูงสุดซึ่งโพสต์เมื่อสี่ปีก่อน
chb

3

ฐานข้อมูล Drop มีอยู่ใน MySQL ทุกเวอร์ชัน แต่ถ้าคุณต้องการรักษาโครงสร้างตารางนี่เป็นแนวคิด

mysqldump - ไม่มีข้อมูล --add-drop-database --add-drop-table -hHOSTNAME -uUSERNAME -p> dump.sql

นี่คือโปรแกรมไม่ใช่คำสั่ง mysql

จากนั้นเข้าสู่ระบบ mysql และ

แหล่งที่มา dump.sql;


1

วิธีง่ายๆในการวางโต๊ะทั้งหมดพร้อมกันจากเทอร์มินัล

สิ่งนี้เกี่ยวข้องกับขั้นตอนไม่กี่ขั้นตอนภายใน mysql shell ของคุณ (ไม่ใช่วิธีแก้ปัญหาขั้นตอนเดียว) สิ่งนี้ได้ผลและช่วยชีวิตฉัน

ทำงานสำหรับเซิร์ฟเวอร์เวอร์ชัน: 5.6.38 MySQL Community Server (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> 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.