2012-06-19 37 views
32

Trong MySQL, tôi muốn thả bảng.
Tôi đã thử nhiều thứ nhưng tôi vẫn nhận được lỗi rằng bảng có tên bericht không thể bị xóa. Đây là lỗi tôi nhận được:Không thể thả bảng: Ràng buộc khoá ngoài không thành công

# 1217 - Can not delete hoặc cập nhật hàng mẹ: một ràng buộc khoá ngoại thất bại

Làm thế nào để thả bảng này?

+2

Tìm hiểu xem bảng nào khác đang tham chiếu nó qua khóa ngoài và trước tiên hãy bỏ ràng buộc FK trên bảng đó, sau đó thả bảng này. –

+0

Bạn cần xóa yêu cầu của các bảng khác trên bảng mà bạn không muốn thêm bất kỳ – BugFinder

+1

Có bất kỳ câu trả lời nào trong số này giúp bạn không? http://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails http://stackoverflow.com/questions/3334619/cannot-delete-hoặc-update-a-parent-row-a-khoá-ngoài-ràng buộc-thất bại –

Trả lời

44

Hãy thử cách này:

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

này nên cung cấp cho bạn mà bảng có tham chiếu đến bảng bạn muốn thả, một khi bạn thả những tài liệu tham khảo, hoặc các tập hợp dữ liệu mà tài liệu tham khảo bộ dữ liệu trong bảng này bạn sẽ có thể để thả các bảng

+4

Giải pháp này là tốt hơn. Đó là an toàn hơn và nó không phải là thực hành xấu như câu trả lời được lựa chọn. – Sloganho

+1

nó làm việc cho tôi, câu trả lời này nên được đánh dấu là chấp nhận. – parvez

68

này nên làm thủ thuật:

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

Như những người khác chỉ ra, điều này gần như không bao giờ bạn muốn, mặc dù đó là những gì được hỏi trong câu hỏi. Một giải pháp an toàn hơn là xóa các bảng tùy thuộc vào bericht trước khi xóa bericht. Xem câu trả lời CloudyMarble về cách thực hiện điều đó. Tôi sử dụng bash và phương thức trong bài viết của tôi để thả tất cả các bảng trong cơ sở dữ liệu khi tôi không muốn hoặc không thể xóa và tạo lại cơ sở dữ liệu.

Lỗi #1217 xảy ra khi các bảng khác có ràng buộc khóa ngoài đối với bảng bạn đang cố xóa và bạn đang sử dụng công cụ cơ sở dữ liệu InnoDB. Giải pháp này tạm thời vô hiệu hóa việc kiểm tra các hạn chế và sau đó bật lại chúng. Đọc số documentation để biết thêm. Đảm bảo xóa các hạn chế và trường khóa ngoài trong bảng tùy thuộc vào bericht, nếu không bạn có thể để cơ sở dữ liệu của mình ở trạng thái bị hỏng.

+2

Điều này nên được chọn trả lời – kyeno

+0

cho đến bây giờ nó là câu trả lời tốt nhất và nên được trên đầu !!!!!! –

+1

Mặc dù nó là chính xác, nó là một BAD THỰC HÀNH tuyệt vời để làm điều này. Như đã được chỉ ra bởi nhiều người dùng (bao gồm cả Rune Kaagaard), bạn nên tìm các tài liệu tham khảo, phân tích và thả chúng khi cần thiết. – zozo

1

Điều này có thể có cùng một bảng với lược đồ khác lý do tại sao bạn nhận được lỗi đó.

Bạn cần phải thả đầu tiên hàng con sau đó hàng cha mẹ.

0

Tôi nhận ra điều này là cũ trong một thời gian và một câu trả lời đã được chọn, nhưng làm thế nào về giải pháp thay thế để cho phép người nước ngoài chính là NULL và sau đó chọn ON DELETE SET NULL.

Về cơ bản, bảng của bạn nên được thay đổi như sau:

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;

Cá nhân tôi sẽ khuyên bạn sử dụng cả hai "ON UPDATE CASCADE" cũng như "ON DELETE SET NULL" để tránh các biến chứng không cần thiết, tuy nhiên thiết lập của bạn có thể dẫn đến một cách tiếp cận khác.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan