Rumah > Artikel > pangkalan data > Bagaimana untuk Memastikan Pemadaman Ibu Bapa dalam PostgreSQL Apabila Tiada Kanak-kanak Merujuknya?
Apabila memadamkan baris anak, selalunya perlu untuk memadamkan induk sebagai baik jika ia tidak lagi dirujuk oleh mana-mana kanak-kanak lain. Ini boleh dicapai dalam PostgreSQL menggunakan CTE yang mengubah suai data, meminimumkan risiko keadaan perlumbaan.
Pertimbangkan pernyataan PostgreSQL berikut:
<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>
Begini cara ia berfungsi:
Untuk menghapuskan sepenuhnya kemungkinan keadaan perlumbaan , adalah disyorkan untuk mengunci baris induk sebelum memadamkan kedua-dua anak dan ibu bapa. Ini memastikan bahawa hanya satu transaksi boleh memproses operasi ini pada satu masa, menghalang berbilang transaksi daripada memadamkan kanak-kanak dan meninggalkan ibu bapa yatim piatu.
Berikut ialah penyata yang dikemas kini dengan penguncian baris:
<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>
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Pemadaman Ibu Bapa dalam PostgreSQL Apabila Tiada Kanak-kanak Merujuknya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!