UPSERT와 반환값

같은 “있으면 수정, 없으면 삽입”도 DBMS마다 충돌 기준과 반환 문법이 다릅니다.

UPSERT는 편리하지만 UNIQUE 제약, 동시성, 중복 매칭 조건을 정확히 잡아야 안전합니다.

PostgreSQL

ON CONFLICT

ON CONFLICT (id)
DO UPDATE SET ...
RETURNING id

충돌 대상을 명시하고, 삽입하려던 값은 EXCLUDED로 참조합니다.

MySQL

ON DUPLICATE KEY

ON DUPLICATE KEY
UPDATE col = new.col

모든 PRIMARY/UNIQUE 충돌이 대상이므로 제약이 여러 개면 의도를 확인합니다.

Oracle / SQL Server

MERGE

MERGE INTO target
USING source
WHEN MATCHED ...

소스가 같은 대상 행에 여러 번 매칭되지 않게 보장해야 합니다.

반환값

RETURNING / OUTPUT

RETURNING id
OUTPUT inserted.id
LAST_INSERT_ID()

생성 키와 DEFAULT 값 확인 문법도 DBMS마다 다릅니다.

충돌 기준

PK/UNIQUE 중 어떤 제약이 충돌을 일으키는지 명확히 봅니다.

동시성

같은 키를 동시에 쓰는 요청은 잠금과 격리 수준을 확인합니다.

반환값

생성 ID가 필요하면 INSERT 직후 조회보다 반환 문법을 우선 검토합니다.