Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Melaksanakan Pemadaman Induk Bertingkat Semasa Pembuangan Anak dalam PostgreSQL?

Bagaimana untuk Melaksanakan Pemadaman Induk Bertingkat Semasa Pembuangan Anak dalam PostgreSQL?

Patricia Arquette
Patricia Arquetteasal
2024-11-01 00:28:29535semak imbas

How to Implement Cascading Parent Deletion Upon Child Removal in PostgreSQL?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn