Saya tidak merancang skema setiap hari, tetapi ketika saya melakukannya, saya mencoba untuk mengatur pembaruan / penghapusan kaskade dengan benar untuk membuat administrasi lebih mudah. Saya mengerti bagaimana kaskade bekerja, tetapi saya tidak pernah ingat tabel mana yang mana.
Sebagai contoh, jika saya memiliki dua tabel - Parent
dan Child
- dengan kunci asing pada Child
referensi itu Parent
dan memiliki ON DELETE CASCADE
, catatan mana yang memicu kaskade dan catatan mana yang bisa dihapus oleh kaskade? Dugaan pertama saya adalah Child
rekaman yang dihapus ketika Parent
catatan dihapus, karena Child
catatan bergantung pada Parent
catatan, tetapi ON DELETE
ambigu; itu bisa berarti menghapus Parent
catatan ketika Child
catatan dihapus, atau itu bisa berarti menghapus Child
catatan ketika Parent
dihapus. Jadi yang mana?
Saya berharap sintaksnya ON PARENT DELETE, CASCADE
, ON FOREIGN DELETE, CASCADE
atau sesuatu yang serupa untuk menghapus ambiguitas. Adakah yang punya mnemonik untuk mengingat ini?
sumber
Order(custID, itemID, orderID)
di manacustID
mengacu pada kunci utama dalamCustomers
tabel danitemID
mengacu pada kunci utama dalamItems
tabel. Tidak akanOrder
memiliki dua orang tua?ON DELETE CASCADE adalah klausa opsional dalam deklarasi kunci asing. Begitu pula dengan deklarasi kunci asing. (Artinya, dalam tabel "anak".)
Salah satu cara untuk menafsirkan deklarasi kunci asing adalah, "Semua nilai yang valid untuk kolom ini berasal dari 'that_column' di 'that_table'." Saat Anda menghapus baris di tabel "anak", tidak ada yang peduli. Itu tidak mempengaruhi integritas data.
Saat Anda menghapus baris dari tabel "parent" - from "that_table" - Anda menghapus nilai yang valid dari nilai yang mungkin untuk tabel "child". Untuk menjaga integritas data, Anda harus melakukan sesuatu pada tabel "child". Menghapus Cascading adalah satu hal yang bisa Anda lakukan.
sumber
SQL: 2011 Spec
Ada lima opsi untuk
ON DELETE
, danON UPDATE
itu bisa berlaku untukFOREIGN KEY
. Ini disebut<referential actions>
, langsung dari SQL: 2011 specKunci asing menetapkan hubungan dependen. Yang
<referential action>
menentukan apa yang terjadi ketika hubungan dibubarkan.Contoh / Metafora / Penjelasan
Untuk contoh ini, kami akan menerima model umum dari masyarakat dan ekonomi: di mana setiap
business
perusahaan adalah perusahaan yang memelihara hubunganbourgeoisie
melaluifatcat_owner
.Jika semua orang
business
secara langsung dipengaruhi olehbourgeoisie
cara merekafatcat_owner
maka apa yang Anda lakukan setelah revolusi pekerja ketika Anda membersihkanfatcat_owner
dan memiliki masyarakat tanpa kelas?Anda memiliki beberapa opsi di sini,
RESTRICT
,. Beberapa orang percaya ini adalah kejahatan yang lebih rendah, tetapi mereka biasanya salah.Biarkan terus. Jika demikian ketika revolusi terjadi SQL memberi Anda empat opsi,
SET NULL
- biarkan kosong. Siapa tahu, mungkin kapitalisme dipulihkan yangbourgeoisie
muncul dan kaum oligarki mengisi daftarfatcat_owners
. Catatan penting, kolom harusNULLABLE
(tidakNOT NULL
) atau ini tidak akan pernah terjadi.SET DEFAULT
- mungkin Anda punyaDEFAULT
yang menangani ini? ADEFAULT
dapat memanggil suatu fungsi. Mungkin skema Anda sudah siap untuk revolusi.CASCADE
- tidak ada kontrol kerusakan. Jikabourgeoisie
berjalan, begitu juga denganbusiness
. Jika suatu bisnis harus memilikifatcat_pig
, maka kadang-kadang lebih masuk akal kehilangan data daripada memiliki non-bisnis dalam sebuahbusiness
tabel.NO ACTION
- ini pada dasarnya adalah metode untuk menunda pemeriksaan, di MySQL tidak ada bedanyaRESTRICT
, tetapi di PostgreSQL, Anda dapat melakukannyaDalam sistem seperti itu, kendala divalidasi hanya sebelum transaksi dilakukan. Ini dapat mengakibatkan penghentian revolusi, tetapi Anda dapat memulihkan dalam transaksi - untuk beberapa tingkat "pulih."
sumber
referenced
tabel berarti tabel induk danreferencing
tabel berarti tabel anak?Mnemonik sederhana adalah
HAPUS orangtua CASCADE [dengan menghapus] di sini
Itu memberitahu Anda yang menghapus (menghapus dari orang tua) yang mengalir, di mana pernyataan ON DELETE CASCADE berjalan (pada anak), dan apa yang akan dihapus (anak).
sumber
yah, mungkin kita bisa merasionalisasi sintaks. Mari kita ambil contoh Python:
apa yang baris ini katakan adalah on_delete of the Parent (yang secara tidak sengaja disebutkan dalam pernyataan), silakan cascade penghapusan ke anak. Itulah sebabnya pernyataan CASCADE didefinisikan di tingkat anak, itu menandai anak-anak yang perlu dihapus
Misalnya jika Anda memiliki kelas lain
struktur ini akan dengan jelas menunjukkan yang mana dari anak-anak perlu dihapus (Anak) dan yang akan tinggal (Orang Dewasa) meskipun yatim piatu
[Sunting: Mengingat konteks diskusi, khususnya dalam kasus on_delete = models.CASCADE dll,] sebenarnya sering kali merupakan perilaku yang diinginkan untuk meninggalkan anak-anak dari orang tua yang dihapus, karena alasan audit dan pelaporan, serta memulihkan ketidaksengajaan. penghapusan. [tentu saja perangkat lunak tingkat perusahaan akan dibangun di sekitar perilaku tersebut dan akan menandai catatan yang dihapus sebagai yang dihapus = 1 bukannya benar-benar menghapusnya dan juga tidak akan memasukkannya dalam kueri untuk ujung depan, dikurangi beberapa laporan yang dirancang khusus. Selain itu ia akan memiliki fungsi membersihkan catatan == 1 yang dihapus dari database, yang biasanya akan dieksekusi oleh administrator UI, sering kali menghindari keterlibatan dari sisi administrator database.]
sumber