Melalui Pemadaman Ibu Bapa semasa Pembuangan Anak
Dalam senario di mana jadual induk mempunyai lajur yang merujuk baris anak, ia menjadi perlu untuk memadamkan induk rekod jika tiada baris anak kekal. PostgreSQL menyediakan pelbagai kaedah untuk mencapai ini.
Satu pendekatan ialah melalui CTE (Ungkapan Jadual Biasa) yang mengubah suai data dalam PostgreSQL 9.1 atau lebih baru:
<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 -- (1) );</code>
Melalui CTE ini, kanak-kanak itu sentiasa dipadamkan, manakala ibu bapa hanya dipadamkan jika ia tidak mempunyai anak lain. Perhatikan, syarat (1) adalah penting untuk mengelakkan keputusan yang tidak dijangka daripada operasi serentak.
Walau bagaimanapun, pendekatan ini tidak terlepas daripada keadaan perlumbaan. Untuk menghapuskannya sepenuhnya, baris induk boleh dikunci sebelum pemadaman:
<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 -- (2) FOR NO KEY UPDATE -- (3) ) , 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 -- (4) );</code>
Dalam kes ini, hanya satu transaksi boleh mengunci induk yang sama, menghalang senario pemadaman serentak. (2) ialah baris anak yang akan dipadamkan. Semasa (3) mengunci baris induk, (4) mengesahkan tiada anak lain wujud sebelum memadamkan ibu bapa.
Untuk kejelasan, syarat (1) dan (4) menghalang pemadaman "palsu" dengan memastikan ibu bapa itu hanya dikeluarkan jika ia tidak mempunyai anak yang tinggal.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pemadaman Induk Bertingkat Semasa Pembuangan Anak dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!