2008-11-10 35 views
33

Duplicate của: When/Why to use Cascading in SQL Server?Tôi có nên sử dụng quy tắc DELETE CASCADE không?

Tôi luôn quá sợ hãi để sử dụng DELETE CASCADE, nhưng khi tôi nhận được tự tin hơn (lười biếng: D), tôi đang nghĩ như thế nào xấu nó có thể được, thực hành tốt nhất để sử dụng nó hay tôi nên tránh nó và làm sạch chìa khóa nước ngoài của tôi, vv theo cách cũ (với các thủ tục được lưu trữ)?

Trả lời

72

TRÊN DELETE CASCADE là tốt, nhưng chỉ khi các hàng phụ thuộc thực sự là phần mở rộng hợp lý của hàng bị xóa. Ví dụ: OK cho DELETE ORDERS xóa ORDER_LINES được liên kết vì rõ ràng bạn muốn xóa đơn đặt hàng này, bao gồm tiêu đề và một số dòng. Mặt khác, DELETE CUSTOMER không nên xóa các đơn đặt hàng liên quan vì ORDERS quan trọng theo đúng nghĩa của chúng, chúng không chỉ là thuộc tính của khách hàng.

Một cách để suy nghĩ về điều này là: nếu tôi phát hành XÓA X và nó cũng xóa Y, tôi có vui hay không vui không? Và nếu tôi phát hành DELETE X và được thông báo là "không thể xóa X vì Y tồn tại", tôi sẽ vui mừng về sự bảo vệ, hoặc bị kích thích ở tính không dây?

+0

Chỉ cần tò mò, nếu khách hàng không tồn tại những gì tốt sẽ ORDER mục làm gì? – codersofthedark

+0

Khách hàng ** sẽ ** tồn tại, vì việc xóa khách hàng sẽ thất bại nếu chúng tôi không cho phép xếp thứ tự. –

+1

@codersofthedark Một kịch bản trong thế giới thực là nếu một quản trị viên tình cờ xóa một người dùng do nhầm lẫn, nó sẽ không xóa các đơn đặt hàng, hoặc toàn bộ bộ phận kế toán sẽ đi tung. – dotslash

10

Tôi muốn kiểm soát chính xác những gì bị xóa (bằng cách khai báo rõ ràng), vì vậy tôi thường chọn xóa thông qua các thủ tục đã lưu và không sử dụng xóa tầng.

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