如果沒有其他子級引用父行,如何刪除它
刪除資料庫表中的子行時,可能有必要如果沒有其他子項引用它,也可以刪除父行。這可以確保資料庫保持引用完整性並防止懸空指標。
使用資料修改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中文網其他相關文章!