Buộc thả mysql bỏ qua ràng buộc khóa ngoại


134

Tôi đang cố xóa tất cả các bảng khỏi cơ sở dữ liệu trừ một bảng và cuối cùng tôi gặp phải lỗi sau:

Không thể xóa hoặc cập nhật hàng cha mẹ: ràng buộc khóa ngoại

Tất nhiên tôi có thể dùng thử và lỗi để xem những ràng buộc chính đó là gì và cuối cùng xóa tất cả các bảng nhưng tôi muốn biết liệu có cách nào nhanh chóng để buộc tất cả các bảng không (vì tôi có thể chèn lại các bảng đó không muốn xóa).

Google nhắm vào một số trang web đề xuất phương pháp sau:

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

Câu trả lời ngắn gọn là nó không thực sự là mánh khóe vì cuối cùng tôi đã nhận được cùng một lỗi trong khi tôi có thể xóa thêm một số bảng. Tôi đã thấy trên các cách Stack Overflow để có được tất cả các khóa ngoại được liên kết với một bảng nhất định nhưng điều đó quá tốn thời gian trừ khi tôi viết kịch bản cho tất cả (điều này có thể thực hiện được trong trường hợp không có tùy chọn nào khác)

Cơ sở dữ liệu là 4.1 nên tôi không thể sử dụng DROP DATABASE

Ý tưởng?


1
Tại sao bạn chọn câu trả lời như đã chọn mà thậm chí không cung cấp giải pháp cho câu hỏi của bạn?
Sanjay

Câu trả lời:


-40

Vì bạn không quan tâm đến việc giữ bất kỳ dữ liệu nào, hãy bỏ toàn bộ cơ sở dữ liệu và tạo một cơ sở dữ liệu mới.


3
Ôi trời, tôi cảm thấy thật ngu ngốc, bây giờ tôi đã thay thế từ DATABASE bằng tên thật của cơ sở dữ liệu thay vì thêm nó sau đó, cảm ơn cả +1
johnnyArt

13
đây không phải là câu trả lời
Freelancer

8
Nó là vui nhộn để xem câu trả lời này đã đánh dấu và upvotes
tom10271

4
@RobertPounder đó chính xác là mục tiêu của tôi, và kể từ khi tôi tham gia trang web này. Tôi đánh giá cao quan điểm của bạn.
Otávio Décio

3
@RobertPounder SO không chỉ giúp đỡ các OP, nó còn là một nguồn tài nguyên "làm thế nào" có thể tìm kiếm, tôi đã tìm đến chủ đề này vì tôi cần phải vô hiệu hóa kiểm tra ràng buộc khóa ngoại và Google đã dẫn tôi đến đây. Tôi rất vui khi bỏ cơ sở dữ liệu là một giải pháp tốt cho OP, nhưng câu trả lời dưới đây thực sự chính xác cho câu hỏi "Buộc thả mysql bỏ qua ràng buộc khóa ngoại".
Val Redigan

403

Điều này có thể hữu ích cho ai đó kết thúc ở đây từ một tìm kiếm. Hãy chắc chắn rằng bạn đang cố gắng thả một bảng và không xem .

SET nước ngoài_key_checks = 0;
- Thả bàn
thả bàn ...
- Thả lượt xem
xem thả ...
SET nước ngoài_key_checks = 1;

SET foreign_key_checks = 0là để tắt kiểm tra khóa ngoại và sau đó SET foreign_key_checks = 1là bật lại kiểm tra khóa ngoại. Trong khi các kiểm tra tắt các bảng có thể được loại bỏ, các kiểm tra sau đó được bật lại để giữ tính toàn vẹn của cấu trúc bảng.


43
PAT là bạn của tôi!
SeanDowney

5
Đây là một câu trả lời đúng hơn. Giải quyết vấn đề cho dù xóa tất cả các bảng, hoặc chỉ một vài. Khủng khiếp!
Luke Stevenson

@PAT Cảm ơn bạn rất nhiều, Nó đã làm việc. mặc dù nó không thể hoạt động trong trình duyệt Mysql Query. Bạn đã cứu ngày của tôi.
MaNn

hoạt động hoàn hảo, tôi đã sử dụng điều này bởi vì tôi không thể bỏ toàn bộ cơ sở dữ liệu
Pablo Pazos

1
Tôi đồng ý rằng đây thường là giải pháp phù hợp nhưng @johnnyArt, người đã đặt câu hỏi, đặc biệt loại trừ đây là một lựa chọn khả thi vì nó không hiệu quả với anh ta. Vì vậy, có vẻ như đây không phải là câu trả lời chính xác cho câu hỏi ban đầu, phải không?
David

18

Nếu bạn đang sử dụng phpmyadmin thì tính năng này đã có sẵn.

  • Chọn các bảng bạn muốn thả
  • Từ danh sách thả xuống ở cuối danh sách bảng, chọn thả
  • Một trang mới sẽ được mở có hộp kiểm ở phía dưới có nội dung "Kiểm tra khóa ngoài", bỏ chọn nó.
  • Xác nhận xóa bằng cách chấp nhận "có".

3
Bạn đã cứu ngày của tôi! Cảm ơn! Làm việc như người ở!
Kami

4

Bạn có thể sử dụng các bước sau, nó giúp tôi bỏ bảng với ràng buộc, giải pháp đã được giải thích trong nhận xét trên, tôi chỉ cần thêm ảnh chụp màn hình cho điều đó -nhập mô tả hình ảnh ở đây


Đây là một bản sao của câu trả lời được bình chọn cao nhất, đã được đăng bốn năm trước.
chb

3

Cơ sở dữ liệu thả tồn tại trong tất cả các phiên bản của MySQL. Nhưng nếu bạn muốn giữ cấu trúc bảng, đây là một ý tưởng

mysqldump --no-data --add-drop-database --add-drop-table -hHOSTNAME -uUSERNAME -p> dump.sql

Đây là một chương trình, không phải là lệnh mysql

Sau đó, đăng nhập vào mysql và

nguồn dump.sql;


1

Giải pháp đơn giản để thả tất cả các bảng cùng một lúc từ thiết bị đầu cuối.

Điều này bao gồm một vài bước bên trong shell mysql của bạn (mặc dù không phải là giải pháp một bước), điều này đã làm việc cho tôi và tiết kiệm trong ngày của tôi.

Đã làm việc cho phiên bản Máy chủ: 5.6,38 Máy chủ Cộng đồng MySQL (GPL)

Các bước tôi làm theo:

 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

Vỏ 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> 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.