如果没有其他子级引用父行,如何删除它
删除数据库表中的子行时,可能有必要如果没有其他子项引用它,也可以删除父行。这可以确保数据库保持引用完整性并防止悬空指针。
使用数据修改 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中文网其他相关文章!