ON CONFLICT를 사용하여 데이터가 있을 경우 UPDATE, 그렇지 않을 경우 INSERT를 구현할 수 있다.
PostgreSQL 9.5 이상부터 사용 가능
INSERT INTO [TABLE] (COLUMN1, COLUMN2, ...)
VALUES (VALUE1, VALUE2, ...)
ON CONFLICT ([column_name / ON CONSTRAINT constraint_name/ WHERE predicate]) [DO NOTHING]
[DO UPDATE SET column1 = value1, ...]
예시
INSERT INTO TBDJCB01
(
KISA_APLY_ID,
APLY_SEQ,
APLY_ID,
ADMIN_NM,
TRS_ID,
FILE_TYPE,
DATA_CFR_YN,
BOND_DATA_PTTN_TYPE
)
SELECT
KISA_APLY_ID,
APLY_SEQ,
APLY_ID,
USER_PSTN,
USER_ID,
'OFFLINE',
'N',
CASE WHEN DA01.PROC_ID IN('P721','P310') THEN 'B'
WHEN DA01.PROC_ID IN('P121','P123') THEN 'D'
END AS BOND_DATA_PTTN_TYPE
FROM TBDJDA01 DA01
WHERE DA01.KISA_APLY_ID = #{kisa_aply_id}
AND DA01.APLY_ID = #{aply_id}
ON CONFLICT(KISA_APLY_ID, APLY_SEQ, APLY_ID, BOND_DATA_PTTN_TYPE)
DO UPDATE
SET FILE_TYPE = 'OFFLINE'
데이터가 있어 ON CONFLICT에 걸릴 경우