Race 없는 insert-or-update
고전 anti-pattern: "행 존재 확인; 있으면 UPDATE, 없으면 INSERT." 그게 둘 동시 실행되면 둘 다 "없음" 봄, 둘 다 INSERT, 한쪽이 unique 제약에 실패. PostgreSQL 의 ON CONFLICT 절이 전체 연산을 atomic 하게.
쓸 세 가지 모양
ON CONFLICT (col) DO NOTHING— 조용한 dedup; "없으면 insert" 에 유용.ON CONFLICT (col) DO UPDATE SET ...— 진정한 upsert; insert 또는 update.ON CONFLICT ON CONSTRAINT name DO ...— 컬럼 추측 대신 named 제약 타겟할 때.
EXCLUDED — INSERT 시도한 행
DO UPDATE 안에서 키워드 EXCLUDED 가 INSERT 에서 온 행. 접두사 없으면 컬럼 이름이 기존 행 참조. 이게 선택권 줘: 옛 값 유지, 새 거 가져가기, 또는 둘에서 계산.