PostgreSQL데이터 조작

RETURNING과 UPSERT

INSERT와 UPDATE 뒤에 바로 결과를 돌려받는 RETURNING과, 충돌 시 갱신으로 이어지는 UPSERT 패턴을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

text
INSERT INTO users (email, name)
VALUES ('ada@example.com', 'Ada')
ON CONFLICT (email)
DO UPDATE SET name = EXCLUDED.name
RETURNING id, email, name;

설명

  • RETURNINGINSERT, 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