Rumah > pangkalan data > tutorial mysql > 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
Lepaskan: 2024-10-29 15:41:02
asal
921 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan