Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara menggunakan DELETE ON CASCADE pada relasi banyak-ke-satu

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:

  1. Bagaimana Anda akan membuat kategori kosong sebelum memasukkan item pertama Anda ke dalamnya? Basis data harus segera menghapusnya.
  2. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perlambatan kecepatan penyisipan saat tabel tumbuh di mysql

  2. Bagaimana cara mendapatkan dump yang benar menggunakan mysqldump dan transaksi tunggal ketika DDL digunakan secara bersamaan?

  3. Dapatkan id dari baris yang dimasukkan menggunakan C #

  4. Pilih baris dari tabel MySQL di mana stempel waktu PHP lebih tua dari X

  5. Cara terbaik untuk menyimpan pengaturan pengguna di MySQL?