기본 패턴
text
INSERT INTO users (email, name)
VALUES ('ada@example.com', 'Ada')
ON CONFLICT (email)
DO UPDATE SET name = EXCLUDED.name
RETURNING id, email, name;설명
RETURNING은INSERT,UPDATE,DELETE뒤에서 실제로 영향을 받은 행을 바로 돌려받는 기능입니다.- 새로 생성된
id를 즉시 받아야 하거나, 수정 결과를 다시 한 번 확인해야 할 때 유용합니다. ON CONFLICT는 고유 제약이나 기본 키가 충돌할 때 어떻게 처리할지 정하는 PostgreSQL의 대표 문법입니다.DO NOTHING은 충돌 시 무시하고,DO UPDATE는 기존 행을 갱신합니다.- 흔히 말하는 UPSERT는 "없으면 넣고, 있으면 갱신"하는 흐름이며, PostgreSQL에서는
INSERT ... ON CONFLICT로 표현합니다.
짧은 예제
text
UPDATE posts
SET published = true
WHERE id = 10
RETURNING id, published, updated_at;빠른 정리
| 문법 | 역할 |
|---|---|
RETURNING | 변경된 행을 바로 반환 |
ON CONFLICT | 충돌 시 처리 방식 지정 |
DO NOTHING | 충돌 시 무시 |
DO UPDATE | 충돌 시 기존 행 갱신 |
주의할 점
ON CONFLICT를 쓰려면 충돌 기준이 되는 고유 제약 또는 기본 키가 먼저 설계되어 있어야 합니다.
즉 UPSERT는 쿼리만의 문제가 아니라 스키마 설계와 함께 생각해야 합니다.
참고 링크
1 sources