스마트웹앱콘텐츠전문가/데이터베이스

[PostgreSQL]있으면 UPDATE, 없으면 INSERT

9D4U 2021. 11. 24. 16:39
728x90
반응형

조건에 맞는 데이터가 있으면 UPDATE, 없으면 INSERT 하는 것을

흔히 'UPSERT' 라고 표현을 합니다.

 

오라클에서는 merge into ~,

mysql에서는 ~ on duplicate on key update ~

를 사용해서 UPSERT를 하듯

 

PostgreSQL에서도 UPSERT를 사용할 수 있습니다.

 

사용 방법은 간단합니다.

이 구문만 따라 해주면 됩니다. ( V9.5 이상에서 사용)

INSERT INTO 'TABLE' (COL1, COL2, ...)
VALUES (VAL1, VAL2, ...)
ON CONFLICT(COL1, COL2)
DO UPDATE SET COL1 = VAL1, ..

주의)

ON CONFLICT 안에 들어 가는 칼럼들은 해당 테이블의 Constraints(예: 유니크 키)에 해당하는 컬럼들이 와 주어야 합니다. 이들을 가지고 UPDATE를 할지 INSERT를 할지 판별을 하니, 당연이 이런 컬럼들을 명명해주어야겠죠.

 

DO UPDATE ~ 여기서 부터는 INSERT 조건에 해당이 안 될 경우,

즉, 이미 해당 데이터가 있을 경우 UPDATE를 하는 구문입니다.

 

cf) DO UPDATE~ 위치에 다른 것도 올 수 있는 데, DO NOTHING 이 올 수 있습니다.

    ... DO NOTHING을 굳이 쓸 이유를 잘 모르겠음... ㅎㅎ (DO NOTHING : CONFLICT 후 INSERT 조건에 해당이 안 될 때   아무것도 안 함)

 

예시) 

INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT (name) 
DO 
   UPDATE SET email = EXCLUDED.email || ';' || customers.email; //EXCLUDED는 기존 값을 의미.

 

참조) https://www.postgresqltutorial.com/postgresql-upsert/

 

728x90