홈 › SQL 실무 › 05 / 9

중복 데이터 찾기와 정리

탐지, 한 건만 남기고 삭제, 재발 방지
섹션 6진행 0 / 9

5. 자주 하는 실수 (Tip)

실수 1: 백업 없이 삭제한다

DELETE 는 커밋하면 되돌리기 어렵습니다. 특히 Oracle 과 MySQL 의 DDL 은 암묵적 커밋이라 정리 스크립트 중간에 넣으면 트랜잭션 경계가 끊깁니다. 백업 테이블은 삭제 전에 한 번만 만들고, 결과를 확인하기 전에는 지우지 않습니다.

실수 2: 삭제 조건을 SELECT 로 미리 보지 않는다

삭제 조건은 SELECT 로 옮겨서 건수와 행을 확인한 뒤 같은 조건으로 바꿉니다. 조건을 다시 쓰다가 NOT 을 빠뜨리면 남길 행을 지웁니다. 예제 6 처럼 WHERE 절을 그대로 복사해 SELECT 와 DELETE 만 바꿉니다.

실수 3: NULL 이 든 컬럼을 키로 삼는다

이메일처럼 비어 있을 수 있는 컬럼 하나를 키로 GROUP BY 하면 NULL 회원이 한 그룹이 되어 하나만 남고 모두 지워집니다. 반대로 = 조건 삭제는 NULL 행을 놓칩니다. 키에 NULL 이 가능한지 먼저 COUNT(*) 와 COUNT(컬럼) 을 비교해 봅니다.

실수 4: NOT IN 서브쿼리가 NULL 을 돌려준다

DELETE ... WHERE email NOT IN (SELECT email ...) 처럼 키 컬럼을 그대로 고르면 서브쿼리에 NULL 이 섞여 0건이 삭제됩니다. 오류도 나지 않아 정리된 줄 알고 넘어가기 쉽습니다. MIN(id) 처럼 NULL 이 없는 값을 고르거나 NOT EXISTS 로 바꿉니다.

실수 5: 정리 없이 UNIQUE 를 건다

중복이 남은 테이블에 UNIQUE 를 걸면 제약이 생성되지 않습니다. 운영에서는 정리, 검증 쿼리 0건 확인, 제약 추가 순서로 진행합니다. 정리가 끝난 뒤에도 애플리케이션이 저장 전에 값을 정규화하지 않으면 사실상 중복은 다시 들어옵니다.