하위 행을 삭제할 때 다음과 같이 상위 항목을 삭제해야 하는 경우가 많습니다. 글쎄요, 다른 어린이가 더 이상 참조하지 않는다면 말이죠. 이는 데이터 수정 CTE를 사용하여 PostgreSQL에서 달성할 수 있으며 경합 조건의 위험을 최소화합니다.
다음 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!