首頁 > 資料庫 > mysql教程 > 當沒有子級引用它時,如何確保 PostgreSQL 中的父級刪除?

當沒有子級引用它時,如何確保 PostgreSQL 中的父級刪除?

Linda Hamilton
發布: 2024-10-29 15:41:02
原創
909 人瀏覽過

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

確保父級在未被任何子級引用時被刪除

刪除子行時,通常需要刪除父級,如下所示如果它不再被任何其他孩子引用就好了。這可以在 PostgreSQL 中使用資料修改 CTE 來實現,從而最大限度地降低競爭條件的風險。

考慮以下 PostgreSQL 語句:

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

它的工作原理如下:

  • del_child CTE 刪除 child_id = 1 的子行。
  • DELETE 語句嘗試根據 del_child 傳回的parent_id 刪除父行。但是,只有在沒有其他子級引用它的情況下,它才會刪除父級。這是透過檢查是否存在具有不同 child_id 的任何其他子項目(NOT EXISTS 子查詢)來實現的。
  • 條件 c.child_id x.child_id 確保子查詢排除剛刪除的子行。

消除競爭條件

徹底消除競爭條件的可能性,建議在刪除子行和父行之前鎖定父行。這可確保一次只有一個事務可以處理此操作,從而防止多個事務刪除子事務並使父事務孤立。

這是帶有行鎖定的更新語句:

<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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板