Postgresql 로 Upsert 하기

유알·2023년 11월 21일
0

ON CONFLICT 활용

Postgres 9.5(2016년 1월 7일 이후 출시) 이후 가능한 문법입니다.

Case1

존재하지 않는 경우 삽입, 존재하는 경우 Nothing

INSERT INTO distributors (id, name)
VALUES (7, 'Redline GmbH')
ON CONFLICT (id) DO NOTHING;

Case2

존재하지 않는 경우 삽입, 존재하는 경우 Update

INSERT INTO distributors (id, dname)
VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc')
ON CONFLICT (id) DO UPDATE SET dname = EXCLUDED.dname;

Case3

삽입이 되었으면, id 반환

INSERT INTO distributors (id, dname)
VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc')
ON CONFLICT (id) DO UPDATE SET dname = EXCLUDED.dname 
RETURNING id;

삽입이 된 경우 삽입된 id값을 반환한다.

주의사항

  • ON CONFLICT의 경우 Serial, BigSerial 같은 타입을 쓸 경우, 실제 삽입이 일어나지 않더라고 값이 증가한다.

MERGE INTO

Postgres 15(2022년 10월 13일) 이후 가능한 문법입니다.

postgresql 에 MERGE 구문이 추가되었습니다.(https://www.postgresql.org/docs/current/sql-merge.html

MERGE INTO customer_account ca
USING recent_transactions t
ON t.customer_id = ca.customer_id
WHEN MATCHED THEN
  UPDATE SET balance = balance + transaction_value
WHEN NOT MATCHED THEN
  INSERT (customer_id, balance)
  VALUES (t.customer_id, t.transaction_value);

너무 좋습니다.

profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글

관련 채용 정보