홈 › SQL 고급 › 08 / 10

MERGE 와 UPSERT

있으면 수정, 없으면 입력
섹션 6진행 0 / 10

5. 자주 하는 실수 (Tip)

실수 1: 원천에 같은 키가 여러 건이다

예제 3 이 이 경우입니다. Oracle 은 ORA-30926, MSSQL 도 오류로 문장이 실패합니다. USING 에 GROUP BY 서브쿼리나 ROW_NUMBER() 로 키당 한 행만 남기는 서브쿼리(고급 01 순위 함수)를 둡니다.

실수 2: 누계를 더하는 MERGE 를 두 번 실행한다

t.total = t.total + s.amt 는 실행할 때마다 더합니다. 배치가 재시도되면 이중으로 반영됩니다(예제 4 의 값이 그 결과). 더하기 방식이라면 원천에 처리 완료 표시를 하거나 처리 일자를 키로 넣어 두 번 실행해도 안전하게 만듭니다. 값을 덮어쓰는 방식(t.total = s.total)은 재실행해도 결과가 같아 안전합니다.

실수 3: REPLACE 를 수정으로 착각한다

MySQL 의 REPLACE 는 지우고 넣는 것이라 지정하지 않은 컬럼이 기본값으로 바뀌고, 자식 테이블의 외래 키가 걸려 있으면 실패하거나 연쇄 삭제가 일어납니다. 일부 컬럼만 고치려면 ON DUPLICATE KEY UPDATE 를 씁니다. 자동 증가 키(중급 11 시퀀스)와 함께 쓸 때도 행이 지워졌다 다시 생기므로 주의합니다.

실수 4: ON 절 컬럼을 수정하려 한다

Oracle 은 ORA-38104 로 막습니다. H2 는 통과시키므로(예제 5) H2 로 시험해 통과했다고 안심하면 안 됩니다.