경쟁 없는 삽입 또는 갱신
존재 여부를 먼저 읽고 INSERT나 UPDATE를 고르면 두 요청이 동시에 “없음”을 보고 충돌할 수 있어. ON CONFLICT는 이 선택을 데이터베이스 안의 원자적 작업으로 만들어.
세 가지 대표 형태
ON CONFLICT (col) DO NOTHING은 지정한 충돌 행을 조용히 건너뛰어.ON CONFLICT (col) DO UPDATE SET ...은 기존 행을 갱신하는 진짜 upsert야.ON CONFLICT ON CONSTRAINT name DO ...은 열 목록 대신 이름 붙은 제약을 충돌 대상으로 삼아.
새 값은 EXCLUDED에서
DO UPDATE 안의 EXCLUDED는 INSERT하려던 새 행을 가리켜. 접두사 없는 열은 기존 행을 뜻하므로 옛 값을 유지할지, 새 값을 쓸지, 둘을 계산할지 명시할 수 있어.