MERGE 와 UPSERT: 있으면 수정, 없으면 입력
하루치 집계값을 누계 테이블에 반영할 때, 이미 있는 키는 더하고 없는 키는 새로 넣어야 합니다. 이 "있으면 UPDATE, 없으면 INSERT" 를 한 문장으로 처리하는 것이 표준
MERGE이고, MySQL 에는INSERT ... ON DUPLICATE KEY UPDATE가 있습니다. 이 레슨은 두 방식과 서로 다른 함정을 실행해서 확인합니다.
1. 왜 배우는가
일 단위 배치는 늘 같은 문제를 만납니다. 오늘 들어온 데이터(원천)를 누계 테이블(대상)에 반영해야 하는데, 어떤 키는 이미 대상에 있고 어떤 키는 처음 보는 값입니다. UPDATE 를 먼저 하고 0건이면 INSERT 하는 코드를 짜면 되지만, 대상 테이블을 두 번 읽고 그 사이에 다른 세션이 끼어들 틈이 생깁니다.
MERGE 는 이 일을 한 문장으로 하고, 원천과 대상을 한 번 맞대어 행마다 UPDATE 할지 INSERT 할지 정합니다. 대량 적재, 마스터 테이블 동기화, 집계 누계 갱신이 모두 이 패턴입니다. 다만 원천에 같은 키가 두 건이면 오류가 나고, ON 절에 쓴 컬럼은 수정할 수 없는 등 DB 마다 규칙이 다릅니다.
MySQL 은 MERGE 문이 없어서 전혀 다른 문법을 씁니다. 세 가지(ON DUPLICATE KEY UPDATE, INSERT IGNORE, REPLACE)가 겉보기엔 비슷하지만 결과가 다르므로, 같은 데이터에 실행해 차이를 봅니다. 중급 08 DDL 과 제약 조건에서 배운 PRIMARY KEY 가 이 충돌 판정의 기준이 됩니다.