2011-08-16 68 views
5

Tôi có 4 bảng. Trong bảng đầu tiên có appid là khóa chính và trong ba bảng khác khóa ngoại của nó. Tôi muốn xóa dữ liệu từ cả ba trong một truy vấn. Tôi đã cố hết sức nhưng thất bại. Ai có thể giúp được không?Xóa bản ghi từ nhiều bảng cùng một lúc?

+0

Đây là vấn đề hành động tham chiếu 'ON DELETE CASCADE' được phát minh để giải quyết. Không giống như @Tony Andrews, tôi đề nghị nó như là một thực tế chung. – onedaywhen

Trả lời

10

Bạn không thể viết câu lệnh xóa tham chiếu nhiều hơn một bảng, bạn cần phải viết 4 câu lệnh xóa.

Tuy nhiên, nếu thích hợp, bạn có thể xác định các khóa ngoài trên 3 bảng con thành "ON DELETE CASCADE". Sau đó, khi bạn xóa khỏi bảng cha, tất cả các hàng liên quan từ 3 bảng con cũng sẽ bị xóa. Điều này có thể hữu ích đôi khi, nhưng tôi sẽ không khuyên bạn nên nó như là một thực hành chung vì nó có thể nguy hiểm và khó hiểu cho các nhà phát triển.

+0

Bạn có thể vui lòng xây dựng trên bản chất nguy hiểm và khó hiểu của các phím nước ngoài xếp tầng? Bởi vì tôi hơi ngạc nhiên bởi nhận xét này. – Rene

+2

@Rene, OK cũng như nó xảy ra Tôi hiện đang làm việc trên một dự án mà ai đó đã thiết lập rất nhiều phím nước ngoài như ON DELETE CASCADE. Vì vậy, ví dụ, nếu một người dùng làm một cái gì đó như 'DELETE order_status_lookup WHERE status_code = 'SHIPPED'' thì nó thành công và tất cả các đơn đặt hàng có trạng thái' SHIPPED 'cũng bị xóa. Tôi gọi đó là một nhưng nguy hiểm! Tôi thực sự sử dụng ON DELETE CASCADE, nhưng chỉ ở nơi nó thực sự có ý nghĩa. –

+0

Vì vậy, những gì bạn đang nói là nó là một công cụ có thể rất hữu ích nhưng được sử dụng sai cách có thể gây hại. Một chút giống như một cưa xích phải không? Nhưng sau đó bạn sẽ khuyên bạn nên cắt giảm tất cả những cây bằng tay? – Rene

3

Không có cách nào để xóa khỏi nhiều bảng với một câu lệnh duy nhất, nhưng câu hỏi hay hơn là tại sao bạn cần phải xóa khỏi tất cả các bảng cùng một lúc? Nghe có vẻ như tôi không hoàn toàn hiểu cách giao dịch hoạt động trong Oracle.

Giả sử bạn đăng nhập và xóa một hàng khỏi bảng 1, nhưng không cam kết. Theo như tất cả các phiên khác có liên quan, hàng đó chưa bị xóa. Nếu bạn mở một kết nối khác và truy vấn cho hàng đó, nó sẽ vẫn ở đó.

Sau đó, bạn xóa khỏi bảng 2, 3 và sau đó là 4 lần lượt. Bạn vẫn chưa cam kết giao dịch, vì vậy tất cả các phiên khác trên cơ sở dữ liệu vẫn có thể thấy các hàng đã xóa.

Sau đó, bạn cam kết.

Tất cả cùng một lúc, các phiên khác sẽ không còn nhìn thấy các hàng bạn đã xóa từ 4 bảng, ngay cả khi bạn đã xóa trong 4 câu lệnh riêng biệt.

+4

Tôi nghĩ rằng bạn đang có một chút khắc nghiệt. Tôi có thể thấy bằng khen trong một cú pháp 'DELETE ALL' để' INSERT ALL': nó sẽ gọn gàng để zap tất cả các bản ghi liên quan trong một tập các bảng mà không phải lo lắng về các phụ thuộc và không sử dụng các ràng buộc hoãn lại. (Mặc dù tôi thừa nhận nhu cầu của tôi cho điều này thường là để quản lý dữ liệu thử nghiệm hơn là trong môi trường sản xuất). – APC

+0

+1 Để biết câu trả lời rõ ràng và chính xác. – Rene

-2

Nếu cơ sở dữ liệu là Mysql bạn có thể sử dụng tham gia vào câu lệnh DELETE. Xem http://dev.mysql.com/doc/refman/5.0/en/delete.html để biết thêm thông tin.

+4

Nhưng nó không phải là. Đó là Oracle. –

+0

Ngoài một nhận xét khác (giao dịch hoặc sử dụng xóa tầng), bạn có thể sử dụng trình kích hoạt để xóa khỏi bảng con. –

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