Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách sử dụng XÓA TRÊN CASCADE trên quan hệ nhiều-một

ON DELETE CASCADE là một cách xóa một hàng khi một hàng mà nó tham chiếu bị xóa. Điều này có nghĩa là:

  • Bạn có một hàng trong bảng A
  • Bạn có một hàng trong bảng B tham chiếu đến một hàng trong bảng A
  • Bạn xóa hàng trong bảng A
  • Cơ sở dữ liệu sẽ xóa hàng tương ứng trong bảng B

Vì vậy, bạn có các mục và mỗi mục thuộc một danh mục cụ thể. Trong bảng mục của bạn, bạn có category_id (và vui lòng sửa lỗi chính tả của bạn) đề cập đến một hàng trong bảng danh mục. Vì vậy, trong tình huống của bạn:

  • Bạn có một danh mục
  • Bạn có một mục tham chiếu đến một danh mục
  • Bạn xóa một danh mục
  • Cơ sở dữ liệu sẽ xóa tất cả các mục tương ứng với danh mục đó

Những gì bạn đang yêu cầu lại theo cách khác:

  • Bạn có các mục
  • Bạn xóa mục cuối cùng trong một danh mục cụ thể
  • Cơ sở dữ liệu sẽ đi và tìm danh mục đó và xóa nó

Không có cách nào để thực hiện việc này với ON DELETE CASCADE , vì hai lý do:

  1. Làm cách nào để bạn tạo một danh mục trống trước khi chèn mục đầu tiên của bạn vào đó? Cơ sở dữ liệu sẽ phải xóa nó ngay lập tức.
  2. Cơ sở dữ liệu sẽ phải thực hiện thêm rất nhiều thao tác quét bảng. Nó không "biết" rằng mục # 23082 là mục cuối cùng trong danh mục; nó sẽ phải bằng cách nào đó theo dõi số lượng mặt hàng trong danh mục để làm điều đó.

Tất cả điều này bắt nguồn từ thực tế là ON DELETE CASCADE là một cách duy trì tính toàn vẹn của tham chiếu . Đó là cách để cơ sở dữ liệu cung cấp cho bạn một đảm bảo chắc chắn rằng nếu bạn thấy danh mục # 20393 trên mục # 9847, khi bạn tìm kiếm danh mục # 20393 bạn biết nó tồn tại . Nó không một thiết bị tiết kiệm lao động. :) Đây là lý do tại sao các tùy chọn khác là ON DELETE SET NULLON DELETE RESTRICT :chúng cũng đảm bảo tính toàn vẹn, nhưng thay vì xóa, chúng xóa tham chiếu không hợp lệ hoặc ngăn việc xóa ban đầu xảy ra.

Vì vậy, câu trả lời là, bạn sẽ phải viết một công việc cron để làm sạch định kỳ bảng đó hoặc sử dụng một số loại kích hoạt BẬT XÓA, nếu bạn lo lắng về các danh mục trống.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mười công cụ GUI của MySQL hàng đầu

  2. Cách cập nhật dữ liệu tuần tự hóa trong MySQL

  3. Cách lưu trữ tốt nhất thông tin người dùng và thông tin đăng nhập và mật khẩu của người dùng

  4. MySQL TRÊN CẬP NHẬT KHÓA DUPLICATE cho nhiều hàng chèn trong một truy vấn

  5. Làm tròn ngày giờ MYSQL thành khoảng thời gian sớm nhất 15 phút tính bằng mili giây (PHP)