如果沒有其他子項引用它,如何刪除 PostgreSQL 中的父行?

Linda Hamilton
發布: 2024-10-28 22:31:30
原創
548 人瀏覽過

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

如果沒有其他子級引用父行,如何刪除它

刪除資料庫表中的子行時,可能有必要如果沒有其他子項引用它,也可以刪除父行。這可以確保資料庫保持引用完整性並防止懸空指標。

使用資料修改CTE

PostgreSQL 9.1 及更高版本提供了使用資料修改的便利解決方案公用表表達式(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>
登入後複製

主要功能:

  • 無條件刪除子級。
  • 父級被刪除僅當它不再有任何剩餘子行時。
  • 最後一個條件對於防止競爭條件並確保並發操作中的正確結果至關重要。

消除競爭條件

要完全消除競爭條件,請在刪除之前鎖定父行:

<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>
登入後複製

此方法可確保一次只有一個事務可以針對同一父級,從而防止意外結果。

以上是如果沒有其他子項引用它,如何刪除 PostgreSQL 中的父行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!