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?
Trả lời
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.
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
@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. –
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
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.
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
+1 Để biết câu trả lời rõ ràng và chính xác. – Rene
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.
Nhưng nó không phải là. Đó là Oracle. –
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. –
- 1. Làm thế nào để bạn chèn nhiều bản ghi vào một bảng cùng một lúc?
- 2. SQL - Chèn và Cập nhật Nhiều Bản ghi cùng lúc
- 3. Xóa bản ghi trong bảng nhiều người
- 4. Nhiều phiên bản của một lớp sẽ bị ghi đè cùng một lúc? (Python)
- 5. Chèn bản ghi MySQL từ nhiều bảng vào bảng mới
- 6. Làm thế nào tôi có thể xóa tất cả các bản ghi từ một TClientDataset cùng một lúc?
- 7. Xóa tầng của bảng dữ liệu và bảng tìm kiếm cùng một lúc
- 8. Selenium nhiều tab cùng một lúc
- 9. Nhiều Giao dịch PayPal cùng một lúc
- 10. Nhiều INNER JOIN từ cùng một bảng
- 11. XNA - Tạo nhiều hạt cùng một lúc
- 12. nhiều trang wget -r cùng một lúc?
- 13. os.walk nhiều thư mục cùng một lúc
- 14. Nhiều trang cùng một lúc trên ViewPager
- 15. Ajax nhiều yêu cầu cùng một lúc
- 16. Tải nhiều tệp cùng một lúc?
- 17. Nhấn nhiều nút cùng một lúc
- 18. Phát nhiều âm thanh cùng một lúc
- 19. jQuery FadeOut nhiều div cùng một lúc
- 20. Truy vấn Hibernate cho cùng một bản ghi nhiều lần
- 21. Xóa tầng trên nhiều thành phần giữa cùng một bảng
- 22. Nhiều luồng có thể ghi dữ liệu vào một tệp cùng lúc không?
- 23. Hibernate: Tránh đọc tất cả các bản ghi vào bộ nhớ cùng một lúc
- 24. Ghi âm và phát iPod cùng một lúc?
- 25. Nhập tệp CSV vào nhiều mô hình cùng một lúc
- 26. Nhiều kết nối SQL từ cùng một bảng với Codeigniter
- 27. Thay đổi mã hóa văn bản cho nhiều tệp cùng một lúc trong Eclipse
- 28. Git: Làm thế nào để rebase nhiều nhánh (với cùng một commit cơ bản) cùng một lúc?
- 29. MySQL chậm khi xóa các bản ghi trong bảng lớn
- 30. Xóa các bản sao từ một bảng lớn
Đâ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