다른 하위 항목을 참조하지 않는 경우 상위 행을 삭제하는 방법
데이터베이스 테이블에서 하위 행을 삭제할 때 필요할 수 있습니다. 다른 하위 항목이 참조하지 않는 경우 상위 행도 삭제합니다. 이렇게 하면 데이터베이스가 참조 무결성을 유지하고 현수 포인터를 방지할 수 있습니다.
데이터 수정 CTE 사용
PostgreSQL 9.1 이상에서는 데이터 수정 CTE를 사용하여 편리한 솔루션을 제공합니다. 공통 테이블 표현식(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!