Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memadam Baris Induk dalam PostgreSQL jika Tiada Anak Lain Merujuknya?

Bagaimana untuk Memadam Baris Induk dalam PostgreSQL jika Tiada Anak Lain Merujuknya?

Linda Hamilton
Linda Hamiltonasal
2024-10-28 22:31:30624semak imbas

How to Delete a Parent Row in PostgreSQL if No Other Children Reference It?

Cara Memadam Baris Ibu Bapa jika Tiada Anak Lain Merujuknya

Apabila memadamkan baris anak dalam jadual pangkalan data, ia mungkin perlu untuk turut memadam baris induk jika tiada kanak-kanak lain merujuknya. Ini memastikan bahawa pangkalan data mengekalkan integriti rujukan dan menghalang penunjuk berjuntai.

Menggunakan CTE Pengubahsuaian Data

PostgreSQL 9.1 dan kemudian menawarkan penyelesaian yang mudah menggunakan pengubahsuaian data ungkapan jadual biasa (CTE):

<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>

Ciri Utama:

  • Kanak-kanak dipadamkan tanpa syarat.
  • Ibu bapa dipadamkan hanya jika ia tidak lagi mempunyai sebarang baris anak yang tinggal.
  • Syarat terakhir adalah penting untuk mengelakkan keadaan perlumbaan dan memastikan keputusan yang betul dalam operasi serentak.

Menghapuskan Syarat Perlumbaan

Untuk menghapuskan sepenuhnya keadaan perlumbaan, kunci baris induk sebelum memadamkan:

<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>

Pendekatan ini memastikan hanya satu transaksi boleh menyasarkan induk yang sama pada satu masa, mengelakkan hasil yang tidak dijangka.

Atas ialah kandungan terperinci Bagaimana untuk Memadam Baris Induk dalam PostgreSQL jika Tiada Anak Lain 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