2013-08-25 49 views
5

Tôi có bảng này trong đó tôi lưu trữ nhận xét. Mọi nhận xét đều có ID riêng và cột isReply trong trường hợp nhận xét là câu trả lời cho nhận xét khác. Tôi đã tự hỏi nếu tôi có thể thiết lập một mối quan hệ để khi một bình luận được xóa tất cả các ý kiến ​​được trả lời cho rằng bình luận sẽ bị xóa tự động. Tôi đã cố gắng thiết lập một chính nước ngoài để cột isReply tham khảo comments.id nhưng tôi đã nhận lỗi này:Khóa ngoài của MySQL trên cùng một bảng

# 1452 - Cannot add or update a child row: a foreign key constraint fails (_db . #sql-1030_31f , CONSTRAINT #sql-1030_31f_ibfk_1 FOREIGN KEY (isReply) REFERENCES comments (id) ON DELETE CASCADE ON UPDATE NO ACTION)

+0

Bạn có thể tạo một sqlfiddle được đơn giản hóa hiển thị lỗi ở trên không? BTW, Đừng quên giới hạn này: http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html * Một tự tham khảo ON DELETE SET NULL, mặt khác , là có thể, như là một tự giới thiệu ON DELETE CASCADE. Các hoạt động xếp tầng có thể không được lồng sâu hơn 15 cấp độ. * – biziclop

+0

'DELETE c1 TỪ nhận xét c1 LEFT THAM GIA các bình luận c2 ON c2.id = c1.isReply WHERE c2.id IS NULL'. Điều này sẽ xóa tất cả trả lời cho các nhận xét đã xóa. Sau đó, thêm một FK sẽ làm việc. Thay vì xóa một cách khác có thể 'UPDATE ... LEFT JOIN ... ON ... SET c1.isReply = NULL WHERE ...'. –

Trả lời

6

Bảng nhận xét của bạn có thể vẫn có câu trả lời với các giá trị isReply tham chiếu các nhận xét đã bị xóa trong quá trình thử nghiệm của bạn. Lắng nghe những gì mà MySQL đang cố gắng nói:

a foreign key constraint fails 

Tất cả những gì bạn phải làm là trống bảng, và sau đó bạn sẽ có hành vi bắt buộc. Một khi FK được tạo ra, không cần phải kích hoạt, đây là lý do tại sao thác tồn tại.

Note rằng có thể bạn sẽ muốn thiết lập các giá trị mặc định cho isReply để null sử dụng:

ALTER TABLE comments CHANGE isReply isReply integer DEFAULT NULL; 
+0

Vâng, bạn đã làm sáng tỏ một số tình huống. Tôi làm trống toàn bộ bảng và thêm khóa thành công, tuy nhiên khi tôi cố gắng thêm bản ghi tôi nhận được 'Không thể thêm hoặc cập nhật hàng con: ràng buộc khóa ngoài không thành công (' _db'.'comments', CONSTRAINT 'opinion_ibfk_1' FOREIGN KEY ('isReply') TÀI LIỆU THAM KHẢO' comments' ('id') ON DELETE CASCADE ON UPDATE NO ACTION)' –

+0

@php_nub_qq Bạn nên thêm chú thích đầu tiên, và * rồi * câu trả lời.Nó sẽ không hoạt động theo cách khác. Hãy thử chèn một bình luận, sau đó một câu trả lời duy nhất cho nó. Gỡ lỗi với các lựa chọn từ bảng để đảm bảo cha mẹ được tham chiếu tồn tại. – edsioufi

+0

Tôi đang chèn nhận xét chứ không phải trả lời nhận xét. Cái này lạ hay gì? –

0

Tạo một kích hoạt để xóa tất cả các hồ sơ với các tiêu chuẩn như nhau. Khi một bản ghi bị xóa trong các bình luận Bảng.

Check triggers documentation

Và nhìn vào this Question

Nếu không, bạn không thể sử dụng cột đó là trong cùng một bảng như chính nước ngoài.

+0

Nhưng trong trường hợp tôi tạo trình kích hoạt, nó sẽ vẫn xuất hiện trong trường hợp xuất và nhập toàn bộ cơ sở dữ liệu:/ –

+0

nếu bạn liên kết để xóa bình luận một truy vấn để xóa câu trả lời, chúng sẽ bị xóa khỏi cơ sở dữ liệu. có thể, nếu bạn muốn lưu trữ chúng trong databse, hãy thử thêm trường boolean 'isDeleted' trong bảng của bạn và thay đổi giá trị của nó từ false thành true –

3

Trên thực tế, một chìa khóa nước ngoài bên trong cùng một bảng hoàn toàn hợp lệ. Một 1452 chỉ đơn giản có nghĩa là bạn có một hoặc nhiều mục tham chiếu một mục không tồn tại (nữa) và do đó là do định nghĩa của bạn khóa ngoài không hợp lệ.

Để biết thêm thông tin, hãy xem: Mysql error 1452 - Cannot add or update a child row: a foreign key constraint fails giải thích lý do tại sao nó không thành công, cách bạn có thể tìm thấy hồ sơ không thành công và cách phá vỡ vấn đề.

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