Saya ingin menggunakan kunci asing untuk menjaga integritas dan menghindari anak yatim (saya sudah menggunakan innoDB).
Bagaimana cara membuat statemen SQL yang HAPUS DI CASCADE?
Jika saya menghapus kategori maka bagaimana saya memastikan bahwa itu tidak akan menghapus produk yang juga terkait dengan kategori lain.
Tabel pivot "categories_products" menciptakan hubungan banyak-ke-banyak antara dua tabel lainnya.
categories
- id (INT)
- name (VARCHAR 255)
products
- id
- name
- price
categories_products
- categories_id
- products_id
mysql
foreign-keys
innodb
Cudos
sumber
sumber
Jawaban:
Jika cascading Anda menghapus nuke produk karena itu adalah anggota dari kategori yang terbunuh, maka Anda telah mengatur kunci asing Anda dengan tidak tepat. Diberikan tabel contoh Anda, Anda harus memiliki pengaturan tabel berikut:
Dengan cara ini, Anda dapat menghapus suatu produk ATAU suatu kategori, dan hanya catatan yang terkait dalam kategori_produk yang akan mati bersama. Kaskade tidak akan berjalan lebih jauh ke pohon dan menghapus tabel kategori produk / induk.
misalnya
Jika Anda menghapus kategori 'merah', maka hanya entri 'merah' di tabel kategori yang mati, serta dua entri prod / kucing: 'sepatu merah' dan 'mantel merah'.
Penghapusan tidak akan menyebabkan penurunan lebih jauh dan tidak akan menghapus kategori 'sepatu boot' dan 'mantel'.
tindak lanjut komentar:
Anda masih salah paham bagaimana cascade delases bekerja. Mereka hanya mempengaruhi tabel di mana "pada penghapusan kaskade" didefinisikan. Dalam kasus ini, kaskade diatur dalam tabel "categories_products". Jika Anda menghapus kategori 'merah', satu-satunya catatan yang akan mengalir menghapus dalam kategori_produk adalah yang ada di mana
category_id = red
. Itu tidak akan menyentuh catatan mana pun di mana 'category_id = biru', dan itu tidak akan melanjutkan perjalanan ke tabel "produk", karena tidak ada kunci asing yang ditentukan dalam tabel itu.Inilah contoh yang lebih konkret:
Katakanlah Anda menghapus kategori # 2 (biru):
DBMS akan melihat semua tabel yang memiliki kunci asing menunjuk pada tabel 'kategori', dan menghapus catatan di mana id yang cocok adalah 2. Karena kami hanya mendefinisikan hubungan kunci asing di
products_categories
, Anda berakhir dengan tabel ini setelah hapus selesai:Tidak ada kunci asing yang ditentukan dalam
products
tabel, sehingga kaskade tidak akan berfungsi di sana, jadi Anda masih memiliki bot dan sarung tangan terdaftar. Tidak ada lagi 'sepatu bot biru' dan tidak ada 'sarung tangan biru' lagi.sumber
CASCADE
beroperasi. Kalau tidak, standar MySQL, MyISAM, akan digunakan dan MyISAM tidak mendukungCASCADE
operasi. Untuk melakukan ini, tambahkan sajaENGINE InnoDB
sebelum yang terakhir;
.Saya bingung dengan jawaban untuk pertanyaan ini, jadi saya membuat test case di MySQL, semoga ini membantu
sumber
Saya pikir (saya tidak yakin) bahwa batasan kunci asing tidak akan melakukan apa yang Anda inginkan dengan desain meja Anda. Mungkin hal terbaik untuk dilakukan adalah mendefinisikan prosedur tersimpan yang akan menghapus kategori seperti yang Anda inginkan, dan kemudian memanggil prosedur itu setiap kali Anda ingin menghapus kategori.
Anda juga perlu menambahkan batasan kunci asing berikut ke tabel tautan:
Klausa CONSTRAINT dapat, tentu saja, juga muncul dalam pernyataan CREATE TABLE.
Setelah membuat objek skema ini, Anda dapat menghapus kategori dan mendapatkan perilaku yang Anda inginkan dengan mengeluarkan
CALL DeleteCategory(category_ID)
(di mana category_ID adalah kategori yang akan dihapus), dan itu akan berperilaku seperti yang Anda inginkan. Tetapi jangan mengeluarkanDELETE FROM
kueri normal , kecuali jika Anda menginginkan lebih banyak perilaku standar (yaitu, hapus hanya dari tabel yang menautkan, dan biarkanproducts
tabel itu sendiri).sumber
KEY pkey (product_id),
ketigaCREATE TABLE
dalam jawaban yang diterima?