Cara Memadam Baris Ibu Bapa jika Tiada Anak Lain Merujuknya
Apabila memadamkan baris anak dalam jadual pangkalan data, ia mungkin perlu untuk turut memadam baris induk jika tiada kanak-kanak lain merujuknya. Ini memastikan bahawa pangkalan data mengekalkan integriti rujukan dan menghalang penunjuk berjuntai.
Menggunakan CTE Pengubahsuaian Data
PostgreSQL 9.1 dan kemudian menawarkan penyelesaian yang mudah menggunakan pengubahsuaian data ungkapan jadual biasa (CTE):
<code class="sql">WITH del_child AS ( DELETE FROM child WHERE child_id = 1 RETURNING parent_id, child_id ) DELETE FROM parent p USING del_child x WHERE p.parent_id = x.parent_id AND NOT EXISTS ( SELECT FROM child c WHERE c.parent_id = x.parent_id AND c.child_id <> x.child_id -- ! );</code>
Ciri Utama:
Menghapuskan Syarat Perlumbaan
Untuk menghapuskan sepenuhnya keadaan perlumbaan, kunci baris induk sebelum memadamkan:
<code class="sql">WITH lock_parent AS ( SELECT p.parent_id, c.child_id FROM child c JOIN parent p ON p.parent_id = c.parent_id WHERE c.child_id = 12 -- provide child_id here once FOR NO KEY UPDATE -- locks parent row. ) , del_child AS ( DELETE FROM child c USING lock_parent l WHERE c.child_id = l.child_id ) DELETE FROM parent p USING lock_parent l WHERE p.parent_id = l.parent_id AND NOT EXISTS ( SELECT FROM child c WHERE c.parent_id = l.parent_id AND c.child_id <> l.child_id -- ! );</code>
Pendekatan ini memastikan hanya satu transaksi boleh menyasarkan induk yang sama pada satu masa, mengelakkan hasil yang tidak dijangka.
Atas ialah kandungan terperinci Bagaimana untuk Memadam Baris Induk dalam PostgreSQL jika Tiada Anak Lain Merujuknya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!