Tôi có một bảng trong đó tôi lưu trữ tất cả các tin nhắn diễn đàn được đăng bởi người dùng trên trang web của tôi. Cấu trúc phân cấp thông điệp được triển khai bằng mô hình tập hợp Nested .
Sau đây là cấu trúc đơn giản của bảng:
- Id (KHÓA CHÍNH)
- Chủ sở hữu_Id (TÀI LIỆU THAM KHẢO NGOẠI TỆ ĐẾN Id )
- Parent_Id (TÀI LIỆU THAM KHẢO NGOẠI TỆ ĐẾN Id )
- nleft
- không sao
- nlevel
Bây giờ, cái bàn trông giống như thế này:
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
| Id | Owner_Id | Parent_Id | nleft | nright | nlevel |
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
| 1 | 1 | NULL | 1 | 8 | 1 |
| 2 | 1 | 1 | 2 | 5 | 2 |
| 3 | 1 | 2 | 3 | 4 | 3 |
| 4 | 1 | 1 | 6 | 7 | 2 |
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
Lưu ý rằng hàng đầu tiên là thông điệp gốc và cây của bài đăng này có thể được hiển thị dưới dạng:
-- SELECT * FROM forumTbl WHERE Owner_Id = 1 ORDER BY nleft;
MESSAGE (Id = 1)
MESSAGE (Id = 2)
Message (Id = 3)
Message (Id = 4)
Vấn đề của tôi xảy ra khi tôi cố gắng xóa tất cả các hàng trong cùng Owner_Id
một truy vấn. Thí dụ:
DELETE FROM forumTbl WHERE Owner_Id = 1 ORDER BY nright;
Truy vấn trên không thành công với lỗi sau:
Mã lỗi: 1451. Không thể xóa hoặc cập nhật hàng cha mẹ: một ràng buộc khóa ngoại không thành công (
forumTbl
, CONSTRAINTOwner_Id_frgn
FOREIGN KEY (Owner_Id
) TÀI LIỆU THAM KHẢOforumTbl
(Id
) TRÊN XÓA KHÔNG CÓ HÀNH ĐỘNG CẬP NHẬT KHÔNG CÓ HÀNH ĐỘNG)
Lý do là hàng đầu tiên , là nút gốc ( Id=1
), cũng có cùng giá trị trong Owner_Id
trường của nó ( Owner_Id=1
) và nó khiến truy vấn không thành công do ràng buộc khóa ngoài.
Câu hỏi của tôi là: Làm thế nào tôi có thể ngăn chặn vòng tròn ràng buộc khóa ngoại này và xóa một hàng tham chiếu đến chính nó? Có cách nào để làm điều đó mà không cần phải cập nhật Owner_Id
hàng gốc lên NULL
không?
Tôi đã tạo một bản demo của kịch bản này: http://sqlfiddle.com/#!9/fd1b1
Cảm ơn bạn.