[PostgreSQL] ON CONFLICT : 데이터 있으면 UPDATE 없으면 INSERT

AikiToWeb·2024년 1월 30일
0

SQL

목록 보기
19/20

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 column_name : 

  • 특정 컬럼명을 기준으로 체크를하며 컬럼을 여러개 넣을수도 있다.(pk기준)

ON CONFLICT ON CONSTRAINT ~ :

  • 테이블 생성시 만든 constraint명을 기준으로 체크한다.

ON CONFLICT WHERE predicate : 

  • UNIQUE INDEX 생성 시 사용(안써봤다.)

데이터가 있어 ON CONFLICT에 걸릴 경우

  • DO NOTHING : 아무런 동작을 안하도록 설정
  • DO UPDATE SET ~ : UPDATE
profile
개발과 합기

0개의 댓글