PostgreSQL에서는 INSERT를 실행할 때 이미 같은 키 값이 존재하면 에러가 발생합니다.
하지만 "있으면 업데이트(Update), 없으면 삽입(Insert)"을 하고 싶을 때가 많죠.
이럴 때 사용할 수 있는 문법이 바로 UPSERT입니다.
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...)
ON CONFLICT (고유키_또는_제약조건)
DO UPDATE SET 컬럼 = EXCLUDED.컬럼;
ON CONFLICT (컬럼) : 충돌을 감지할 컬럼 (주로 PRIMARY KEY, UNIQUE 제약 조건)EXCLUDED.컬럼 : 새로 들어온 값 참조CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT UNIQUE,
name TEXT
);
INSERT INTO users (email, name)
VALUES ('test@example.com', '홍길동')
ON CONFLICT (email)
DO UPDATE SET name = EXCLUDED.name;
👉 결과
email이 없으면 → 새로 삽입email이 있으면 → name만 업데이트충돌 시 아무 일도 하지 않으려면 DO NOTHING을 사용합니다.
INSERT INTO users (email, name)
VALUES ('test@example.com', '김철수')
ON CONFLICT (email) DO NOTHING;
INSERT ... ON CONFLICT 구문으로 처리한다.DO UPDATE 또는 DO NOTHING 선택 가능.ON DUPLICATE KEY UPDATE와 비슷하지만, PostgreSQL은 더 표준 SQL에 가깝다.