개키우는개발자 : )

PostgreSQL UPSERT 문법 본문

PostgreSQL/데이터 조작 및 테이블 관리

PostgreSQL UPSERT 문법

DOGvelopers 2019. 11. 16. 14:12
반응형

UPSERT 문

INSERT를 시도할때 조건(상황)에 따라 UPDATE를 할 수 있는 구문입니다. 복잡한 업무 처리에 자주 사용 됩니다.

 

기본문법

 

- INSERT가 충돌 시 다른 액션을 취합니다.

INSERT
	INTO
	TABLE_NAME(COLUMN_1)
VALUES(VALUE_1) ON
CONFLICT TARGET ACTION;

 

실습준비

 

- CUSTOMERS 테이블 생성 후 데이터 저장

CREATE TABLE CUSTOMERS 
(
	CUSTOMER_ID SERIAL PRIMARY KEY,
	NAME VARCHAR UNIQUE,
	EMAIL VARCHAR NOT NULL,
	ACTIVE BOOL NOT NULL DEFAULT TRUE
);

INSERT INTO CUSTOMERS (NAME,EMAIL)
VALUES
('IBM','CONTACT@IBM.COM'),
('MICROSOFT','CONTACT@MICROSOFT.COM'),
('INTEL','CONTACT@INTEL.COM');

COMMIT;

NAME 컬럼이 UNIQUE 제약 조건이므로 중복된 데이터는 저장할 수 없습니다.

준비1

 

실습

 

- CUSTOMERS 테이블에 NAME,EMAIL을 INSERT 하는데 NAME값이 중복되어 충돌이 발생했을때 아무 일도 없도록 적용 합니다.

INSERT
	INTO
	CUSTOMERS(NAME,
	EMAIL)
VALUES ('MICROSOFT',
'HOTLINE@MICROSOFT.COM') ON
CONFLICT (NAME) DO NOTHING;

COMMIT;

기존 CUSTOMERS테이블의 NAME 값 중 MICROSOFT는 존재 하기 때문에 충돌이 발생 합니다.

ON CONFLICT (NAME) DO NOTHING 문을 사용하여 NAME이 충돌시 아무 것도 실행하지 않습니다.

실습1

- CUSTOMERS 테이블에 NAME,EMAIL을 INSERT 하는데 NAME값이 중복되어 충돌시 EMAIL값은 INSERT할 때 작성한 EMAIL값과 현재 적용되어 있는 EMAIL값을 UPDATE하세요

INSERT
	INTO
	CUSTOMERS(NAME,
	EMAIL)
VALUES ('MICROSOFT',
'HOTLINE@MICROSOFT.COM') ON
CONFLICT (NAME) DO
UPDATE
SET
	EMAIL = EXCLUDED.EMAIL || ';' || CUSTOMERS.EMAIL;

COMMIT;

INSERT 시 작성한 HOTLINE@MICROSOFT.COM 기존의 CONTACT@MICROSOFT.COM값이 수정되어 있는것을 볼 수 있습니다.

실습2

EXCLUDED.EMAIL = INSERT를 시도하는 데이터

CUSTOMERS.EMAIL = 기존에 저장되어 있는 데이터

반응형

'PostgreSQL > 데이터 조작 및 테이블 관리' 카테고리의 다른 글

PostgreSQL IMPORT 작업  (0) 2019.11.17
PostgreSQL EXPORT 작업  (0) 2019.11.16
PostgreSQL DELETE 문  (0) 2019.11.16
PostgreSQL UPDATE JOIN 문  (0) 2019.11.16
PostgreSQL UPDATE 문  (2) 2019.11.16
Comments