Contents
see List작성일 2015. 05. 02.
Oracle 계층구조(답글, 댓글) 전부 삭제하기
게시판에서 원글을 삭제할 때 하위 답글, 댓글까지 모두 삭제하는 Oracle 쿼리입니다.
언제 사용하나요?
- 게시글 삭제 시 모든 답글/대댓글 함께 삭제
- 카테고리 삭제 시 하위 카테고리 함께 삭제
- 조직도에서 부서 삭제 시 하위 부서 포함 삭제
- 트리 구조 데이터의 일괄 삭제
테이블 구조 예시
CREATE TABLE board (
board_seq NUMBER PRIMARY KEY,
parent_seq NUMBER, -- 부모글 번호 (NULL이면 원글)
title VARCHAR2(200),
content CLOB,
use_yn CHAR(1) DEFAULT \047Y\047
);
-- 답글 구조
-- board_seq=1 (원글)
-- └ board_seq=2 (답글, parent_seq=1)
-- └ board_seq=3 (대댓글, parent_seq=2)
-- └ board_seq=4 (답글, parent_seq=1)계층 구조 조회 (CONNECT BY)
-- 특정 글과 모든 하위 글 조회
SELECT board_seq, parent_seq, title, LEVEL
FROM board
START WITH board_seq = 1 -- 시작점 (원글)
CONNECT BY PRIOR board_seq = parent_seq -- 부모-자식 연결
ORDER SIBLINGS BY board_seq;계층 구조 삭제 (서브쿼리 사용)
-- 방법 1: 서브쿼리로 삭제
DELETE FROM board
WHERE board_seq IN (
SELECT board_seq
FROM board
START WITH board_seq = :delete_seq
CONNECT BY PRIOR board_seq = parent_seq
);논리적 삭제 (USE_YN 업데이트)
-- 실제 삭제 대신 USE_YN = \047N\047으로 변경
UPDATE board
SET use_yn = \047N\047
WHERE board_seq IN (
SELECT board_seq
FROM board
START WITH board_seq = :delete_seq
CONNECT BY PRIOR board_seq = parent_seq
);MyBatis 적용
<!-- BoardMapper.xml -->
<delete id="deleteWithReplies" parameterType="long">
DELETE FROM board
WHERE board_seq IN (
SELECT board_seq
FROM board
START WITH board_seq = #{boardSeq}
CONNECT BY PRIOR board_seq = parent_seq
)
</delete>
<update id="softDeleteWithReplies" parameterType="long">
UPDATE board
SET use_yn = \047N\047,
upd_date = SYSDATE
WHERE board_seq IN (
SELECT board_seq
FROM board
START WITH board_seq = #{boardSeq}
CONNECT BY PRIOR board_seq = parent_seq
)
</update>CTE(Common Table Expression) 방식
-- Oracle 11g R2 이상
WITH RECURSIVE tree AS (
SELECT board_seq
FROM board
WHERE board_seq = :delete_seq
UNION ALL
SELECT b.board_seq
FROM board b
INNER JOIN tree t ON b.parent_seq = t.board_seq
)
DELETE FROM board
WHERE board_seq IN (SELECT board_seq FROM tree);외래키 CASCADE 설정
-- 테이블 생성 시 CASCADE 설정
CREATE TABLE board (
board_seq NUMBER PRIMARY KEY,
parent_seq NUMBER REFERENCES board(board_seq) ON DELETE CASCADE,
title VARCHAR2(200)
);
-- 이렇게 하면 부모 삭제 시 자식 자동 삭제
DELETE FROM board WHERE board_seq = 1; -- 하위 글도 자동 삭제삭제 전 하위 글 개수 확인
SELECT COUNT(*) as total_count
FROM board
START WITH board_seq = :board_seq
CONNECT BY PRIOR board_seq = parent_seq;주의사항
- 삭제 전 트랜잭션 시작 필수
- 대용량 삭제 시 배치 처리 고려
- 실제 DELETE 전 SELECT로 영향 받는 데이터 확인
- 첨부파일 등 연관 데이터도 함께 처리 필요
연관 테이블 함께 삭제
-- 첨부파일, 댓글 등도 함께 삭제
DELETE FROM board_file
WHERE board_seq IN (
SELECT board_seq
FROM board
START WITH board_seq = :delete_seq
CONNECT BY PRIOR board_seq = parent_seq
);
DELETE FROM board_comment
WHERE board_seq IN (
SELECT board_seq
FROM board
START WITH board_seq = :delete_seq
CONNECT BY PRIOR board_seq = parent_seq
);
DELETE FROM board
WHERE board_seq IN (
SELECT board_seq
FROM board
START WITH board_seq = :delete_seq
CONNECT BY PRIOR board_seq = parent_seq
);database
| No | 작성일 | Title |
|---|---|---|
| 2914 | 2026. 05. 30. | PostgreSQL Autovacuum 운영 점검: 테이블 팽창과 느린 쿼리를 막는 VACUUM·ANALYZE 실전 가이드 |
| 2859 | 2026. 05. 22. | PostgreSQL 운영 백업과 PITR 복구 점검: pg_dump, pg_basebackup, WAL 보관 실전 가이드 |
| 2777 | 2026. 05. 14. | MySQL 8.4 LTS 운영 쿼리 튜닝: 실행 계획, 히스토그램, 복합 인덱스 실전 점검법 |
| 2619 | 2026. 04. 26. | PostgreSQL 18 완전 정복: Async I/O, UUIDv7, Temporal 제약 조건 실전 가이드 |
| 2536 | 2026. 04. 18. | pgvector + PostgreSQL 벡터 검색 완전 정복 — 설치부터 RAG 시스템 구축까지 |
| 2493 | 2026. 04. 14. | PostgreSQL 17 핵심 기능 완벽 가이드: JSON_TABLE, 쿼리 최적화, 벡터 검색 통합 |
| 2472 | 2026. 04. 13. | PostgreSQL 18 신기능 완벽 가이드: 비동기 I/O, UUIDv7, Index Skip Scan |
| 2452 | 2026. 04. 12. | PostgreSQL 17 + pgvector로 구축하는 AI 시맨틱 검색 시스템 |
| 2428 | 2026. 04. 11. | PostgreSQL 17 SQL/JSON 함수 완벽 가이드 |
| 2392 | 2026. 04. 09. | PostgreSQL 17 쿼리 최적화 실전 가이드 - B-Tree 개선, JSON_TABLE, VACUUM 튜닝 |