[ PostgreSQL ] Upsert 정리

2021. 7. 28. 16:43· Back-End/PostgreSQL
반응형
SMALL

참고 : https://www.postgresqltutorial.com/postgresql-upsert/

 

일단 샘플 예제를 만들기 위해

DROP TABLE IF EXISTS 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');

데이터를 넣어 줍니다!

 

테이블을 확인 해보면 위와 같이 잘 들어간 것을 확인 할수 있습니다.

 

Microsoft의 이메일을 contact@microsoft.com 에서 hotline@microsoft.com 로 바꾸려면 그냥 update문을 입력하면 되는데 upsert문 예시를 들기 위해 아래와 같이 입력을 해줍니다.

INSERT INTO customers (NAME, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT ON CONSTRAINT customers_name_key 
DO NOTHING;

이건 고객이름이 테이블에 있는경우 DO NOTHING 아무것도 하지 않는 명령어라고 합니다.

 

테이블을 만들때 name컬럼의 데이터 타입을 VARCHAR UNIQUE 로 줘서 위와 같이 입력해도 되는듯 합니다.(본인생각..)

 

직접 확인해보니 email 이 바뀌지 않은 것을 확인 할수 있습니다.

 

다음으론 위 명령문과 동일하지만 name 컬럼을 이용하여 UPSERT를 하는 구문 입니다.

INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT (name) 
DO NOTHING;

이 구문 역시 DO NOTHING 이니 email 컬럼은 변하지 않습니다.

 

이제 업데이트를 하려면

INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com') 
ON CONFLICT (name) 
DO 
   UPDATE SET email = EXCLUDED.email || ';' || customers.email;

이렇게 DO UPDATE SET 을 입력해 줍니다.

 

결과를 확인해 보면

 

위와 같이 Microsoft의 이메일 값이 변경 된 것을 확인 할 수 있습니다.

 

EXCLUDED 는 새로 입력되는 값

customers(테이블 명)는 으로 기존에 있던 값

 

으로 이해하면 되는 듯 합니다.

 

 

PS.

이걸 기반으로 이것저것 해보다가

 

ON CONFLICT 절을 사용하는 경우, unique 나 exclude 제약 조건이 있어야 함

 

이런 에러가 나왔었는데

 

-- 에러
INSERT INTO ~ (~)
VALUES(~) 
ON CONFLICT (~~_seq)
DO UPDATE SET send_yn   = EXCLUDED.send_yn
;

-- 해결
INSERT INTO ~ (~)
VALUES(~) 
ON CONFLICT ON CONSTRAINT pk_t_~~~_info
DO UPDATE SET send_yn   = EXCLUDED.send_yn
;

위와 같이 컬럼명 말고 ON CONSTRAINT 하고 pk_테이블명 이렇게 입력 해줬더니 에러가 해결 되었습니다.

 

위 정보는 테이블을 만들때

 

CREATE TABLE 테이블(

…

CONSTRAINT 제약_조건_이름 PRIMARY KEY (컬럼)

);

이런식으로 PK에 대한 제약_조건_이름이 붙는데 이것을 가져다가 사용한 것 입니다.

반응형

'Back-End > PostgreSQL' 카테고리의 다른 글

[ PostgreSQL ] 앞에 숫자0 제거 방법 (regexp_replacd)  (1) 2021.08.27
[ PostgreSQL ] 문자열 자르기 (substring), 구분자로 자르기 (split_part)  (0) 2021.08.23
[PostgreSQL] 문자열 마스킹 쿼리  (0) 2021.06.08
[ PostgreSQL ] EXECUTE format 사용방법  (0) 2021.05.27
[ PostgreSQL ] 컬럼 데이터 합치기  (0) 2021.02.03
'Back-End/PostgreSQL' 카테고리의 다른 글
  • [ PostgreSQL ] 앞에 숫자0 제거 방법 (regexp_replacd)
  • [ PostgreSQL ] 문자열 자르기 (substring), 구분자로 자르기 (split_part)
  • [PostgreSQL] 문자열 마스킹 쿼리
  • [ PostgreSQL ] EXECUTE format 사용방법
- 광속거북이 -
- 광속거북이 -
IT관련 일하면서 공부 및 일상 에 관한 내용들을 기록하기 위한 블로그 입니다.
누리IT관련 일하면서 공부 및 일상 에 관한 내용들을 기록하기 위한 블로그 입니다.
- 광속거북이 -
누리
- 광속거북이 -
전체
오늘
어제
  • 카테고리 (451)
    • 구글문서 (4)
    • 설치방법들 (3)
    • FrameWork (73)
      • Django (6)
      • Python (32)
      • AngularJS (13)
      • spring (21)
    • Programing (61)
      • JAVA (11)
      • etc... (2)
      • 오류 해결 (29)
      • Algorithm (5)
    • Front-End (25)
      • CSS (3)
      • html (6)
      • javascript (10)
      • vueJS (5)
    • Back-End (35)
      • 리눅스 (12)
      • PostgreSQL (14)
      • MySQL (2)
      • Shell (1)
      • docker (1)
      • GIT (1)
    • Util (9)
      • BIRT (2)
      • JMeter (3)
      • MobaXterm Personal (1)
      • ClipReport (2)
    • 이클립스 설정 (10)
      • SVN (1)
    • 업무중 기록해둘 것들... (1)
    • 영화 (8)
    • etc.. (197)
      • 여행 (25)
      • 문화생활 (3)
      • tistory (3)
      • 글, 생각 (4)
      • 먹을 곳 (29)
      • issue (4)
      • 결혼 (1)
      • 가족여행기록 (1)
      • Tip (50)
      • 강아지 (5)
      • 일기 (0)
      • 게임 (3)
      • 주식 (7)
      • 코로나19 (7)
      • 맥북 (5)
    • 비공개 (0)
      • 보나 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • Java
  • 해지
  • 인텔리제이
  • target
  • 삼성증권
  • 윈도우10
  • 제주도
  • 포켓몬고
  • 이클립스
  • 합정
  • 설치
  • VSCode
  • 카페
  • PostgreSQL
  • 맛집
  • 리눅스
  • 연천
  • tomcat
  • IntelliJ
  • 백준

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
- 광속거북이 -
[ PostgreSQL ] Upsert 정리
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.