다른 자식이 참조하지 않는 경우 PostgreSQL에서 부모 행을 삭제하는 방법은 무엇입니까?
다른 하위 항목을 참조하지 않는 경우 상위 행을 삭제하는 방법
데이터베이스 테이블에서 하위 행을 삭제할 때 필요할 수 있습니다. 다른 하위 항목이 참조하지 않는 경우 상위 행도 삭제합니다. 이렇게 하면 데이터베이스가 참조 무결성을 유지하고 현수 포인터를 방지할 수 있습니다.
데이터 수정 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Alter Table 문을 사용하여 MySQL에서 테이블을 어떻게 변경합니까?

MySQL의 문제를 해결하는 방법 공유 라이브러리를 열 수 없습니다.

Linux에서 MySQL을 실행합니다 (Phpmyadmin이있는 Podman 컨테이너가 포함되지 않음)

인기있는 MySQL GUI 도구는 무엇입니까 (예 : MySQL Workbench, Phpmyadmin)?
