Postgres 9.5(2016년 1월 7일 이후 출시) 이후 가능한 문법입니다.
존재하지 않는 경우 삽입, 존재하는 경우 Nothing
INSERT INTO distributors (id, name)
VALUES (7, 'Redline GmbH')
ON CONFLICT (id) DO NOTHING;
존재하지 않는 경우 삽입, 존재하는 경우 Update
INSERT INTO distributors (id, dname)
VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc')
ON CONFLICT (id) DO UPDATE SET dname = EXCLUDED.dname;
삽입이 되었으면, 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 같은 타입을 쓸 경우, 실제 삽입이 일어나지 않더라고 값이 증가한다.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);
너무 좋습니다.