Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Memastikan Pemadaman Ibu Bapa dalam PostgreSQL Apabila Tiada Kanak-kanak Merujuknya?

Bagaimana untuk Memastikan Pemadaman Ibu Bapa dalam PostgreSQL Apabila Tiada Kanak-kanak Merujuknya?

Linda Hamilton
Linda Hamiltonasal
2024-10-29 15:41:02830semak imbas

How to Ensure Parent Deletion in PostgreSQL When No Children Reference It?

Memastikan Pemadaman Ibu Bapa Apabila Tidak Dirujuk oleh Mana-mana Anak

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:

  • CTE del_child memadamkan baris anak dengan child_id = 1.
  • Pernyataan DELETE cuba memadamkan baris induk berdasarkan parent_id yang dikembalikan daripada del_child. Walau bagaimanapun, ia hanya memadamkan ibu bapa jika tiada anak lain yang merujuknya. Ini dicapai dengan menyemak kewujudan mana-mana kanak-kanak lain dengan child_id yang berbeza (TIDAK WUJUD subquery).
  • Syarat c.child_id <> x.child_id memastikan bahawa subquery mengecualikan baris anak yang baru dipadamkan.

Menghapuskan Syarat Perlumbaan

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!

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