刪除子行時,通常需要刪除父級,如下所示如果它不再被任何其他孩子引用就好了。這可以在 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>
它的工作原理如下:
徹底消除競爭條件的可能性,建議在刪除子行和父行之前鎖定父行。這可確保一次只有一個事務可以處理此操作,從而防止多個事務刪除子事務並使父事務孤立。
這是帶有行鎖定的更新語句:
<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中文網其他相關文章!