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 제약 조건이므로 중복된 데이터는 저장할 수 없습니다.
실습
- 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이 충돌시 아무 것도 실행하지 않습니다.
- 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값이 수정되어 있는것을 볼 수 있습니다.
EXCLUDED.EMAIL = INSERT를 시도하는 데이터
CUSTOMERS.EMAIL = 기존에 저장되어 있는 데이터
반응형