홈 › SQL 고급 › 08 / 10

MERGE 와 UPSERT

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

6. 정리

MERGE 는 원천과 대상을 ON 으로 맞대어 있으면 UPDATE, 없으면 INSERT 하는 UPSERT 문입니다.

Oracle 9i(하나의 WHEN 만은 10g, UPDATE 뒤 WHERE·DELETE WHERE 도 10g), Tibero, MSSQL 2008 이 지원합니다.

MSSQL 은 세미콜론 필수, BY SOURCE, OUTPUT $action 이 더 있으며 동시 실행 시 HOLDLOCK 을 함께 쓰라는 권고가 있습니다.

함정은 세 가지입니다. 원천에 같은 키가 여러 건이면 Oracle ORA-30926 등 오류가 나므로 GROUP BY·ROW_NUMBER() 로 키당 한 행을 만듭니다. Oracle 은 ON 절 컬럼을 UPDATE 할 수 없고(ORA-38104, H2 는 통과시킴), 더하기 방식 MERGE 는 재실행하면 이중 반영됩니다.

MySQL 은 MERGE 가 없고 INSERT ... ON DUPLICATE KEY UPDATE(PK·UNIQUE 충돌 기준, 8.0.19 부터 AS new 별칭 권장)를 씁니다.

충돌 행을 건너뛰는 INSERT IGNORE(다른 오류도 경고로 바꿈)와 지우고 다시 넣는 REPLACE 도 있습니다. REPLACE 는 지정하지 않은 컬럼이 기본값이 되므로 H2 에서 재현되지 않는 것에 유의하세요. UPDATE 후 0건이면 INSERT 하는 2문장 방식은 두 번 접근하고 동시성 문제가 있어 대량 처리에는 맞지 않습니다.

다음 레슨은 문자열 패턴을 찾고 바꾸는 정규식 함수(REGEXP_LIKE, REGEXP_REPLACE 등)입니다. 제약 조건은 중급 08 DDL 과 제약 조건, 자동 증가 키는 중급 11 시퀀스를 참고하세요.