ON DELETE CASCADE
adalah cara menghapus baris ketika baris yang direferensikannya dihapus. Artinya:
- Anda memiliki satu baris di tabel A
- Anda memiliki baris di tabel B yang mereferensikan baris di tabel A
- Anda menghapus baris pada tabel A
- Database menghapus baris yang sesuai di tabel B
Jadi Anda memiliki item, dan setiap item termasuk dalam kategori tertentu. Di tabel item Anda, Anda memiliki id_kategori (dan harap perbaiki ejaan Anda) yang merujuk ke baris dalam tabel kategori. Jadi, dalam situasi Anda:
- Anda memiliki kategori
- Anda memiliki item yang merujuk pada suatu kategori
- Anda menghapus sebuah kategori
- Database menghapus semua item yang sesuai dengan kategori tersebut
Yang Anda minta adalah sebaliknya:
- Anda memiliki item
- Anda menghapus item terakhir dalam kategori tertentu
- Database pergi dan menemukan kategori itu dan menghapusnya
Tidak ada cara untuk melakukan ini dengan ON DELETE CASCADE
, karena dua alasan:
- Bagaimana Anda akan membuat kategori kosong sebelum memasukkan item pertama Anda ke dalamnya? Basis data harus segera menghapusnya.
- Basis data harus melakukan banyak pekerjaan ekstra untuk memindai tabel. Tidak "tahu" bahwa item #23082 adalah item terakhir dalam kategori; entah bagaimana harus melacak jumlah item dalam kategori untuk melakukan itu.
Ini semua berasal dari fakta bahwa ON DELETE CASCADE
adalah cara mempertahankan integritas referensial . Artinya, ini adalah cara database untuk memberi Anda jaminan kuat bahwa jika Anda melihat kategori #20393 pada item #9847, ketika Anda mencari kategori #20393 Anda tahu itu ada . Itu tidak perangkat hemat tenaga kerja. :) Inilah sebabnya mengapa opsi lainnya adalah ON DELETE SET NULL
dan ON DELETE RESTRICT
:mereka juga menjamin integritas, tetapi alih-alih menghapus, mereka menghapus referensi buruk atau mencegah penghapusan asli terjadi.
Jadi jawabannya adalah, Anda harus menulis tugas cron untuk membersihkan tabel itu secara berkala atau menggunakan semacam pemicu ON DELETE, jika Anda khawatir dengan kategori kosong.