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

Linda Hamilton
Lepaskan: 2024-10-28 22:31:30
asal
548 orang telah melayarinya

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

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

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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!