Notice
Recent Posts
Recent Comments
Link
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- jenkins
- 자바
- bekjoon
- boj
- ora-01476
- 백준
- javascript
- 환경번수
- 서버 접근
- linux
- 메뉴얼
- java
- 제수가 0입니다
- 1773번
- putty
- available plugins
- poll scm
- 백준 java jaekjoon JAVA
- subversion
- 사용법
- tomcat-users.xml
- jsonb select
- baekjoon
- 백준 JAVA
- rocky linux
- jaekjoon java
- SVN
- DBeaver
- Rocky Linux 9
- PostgreSQL
Archives
기록하는 개발자
PostgreSQL UPSERT (UPDATE+INSERT) 본문
UPSERT란?
UPDATE+INSERT를 합친것으로
기존 데이터가 존재하면 UPDATE해주고
기존 데이터가 존재하지 않으면 INSERT로 신규 등록해주는 기능
테스트 테이블 정보
-- DROP TABLE public.upsert_test_table;
CREATE TABLE public.upsert_test_table (
sn int4 NOT NULL, -- 순번
user_name varchar NULL, -- 데이터
regist_dt timestamp NOT NULL, -- 등록일시
modify_dt timestamp NULL -- 수정일시
);
-- Column comments
COMMENT ON COLUMN public.upsert_test_table.sn IS '순번';
COMMENT ON COLUMN public.upsert_test_table.user_name IS '데이터';
COMMENT ON COLUMN public.upsert_test_table.regist_dt IS '등록일시';
COMMENT ON COLUMN public.upsert_test_table.modify_dt IS '수정일시';
테스트 쿼리
WITH UPSERT AS ( UPDATE upsert_test_table --update 시작
SET user_name = 'gitseok',
modify_dt = now()
WHERE sn = 1::bigint --update 끝
RETURNING *) --update 데이터 출력(sn, user_name 등 컬럼 지정 가능)
INSERT INTO upsert_test_table ( --insert시작
sn,
user_name,
regist_dt
)
SELECT
1::bigint,
'gitseok',
now() --insert끝
WHERE NOT EXISTS(SELECT sn FROM UPSERT) --row가 존재한다면 false
쿼리 분석
주어진 데이터를 가지고 insert문을 실행
조건문에 있는 NOT EXISTS 에 row 반환이 1이라도 있다면 false 없다면 true
어떤 데이터의 row인가? update한 결과가 UPSERT라는 임시 테이블로 생성됨
WITH UPSERT 내부에 있는 UPDATE문이 돌아감(동일한 sn을 가진 데이터가 있다면 업데이트)
UPDATE 결과가 어떻게 출력되는가?
RETURNING *(모든내용출력 원하는 컬럼들만 기입 가능 [예시 : sn, user_name]) 을 통해서
update가 진행되었다면 해당 로우가 출력됨
-> update가 진행됐다? : row가 존재함으로 where에 false가 들어가고 insert문이 실행되지 않음
-> update가 진행되지 않았다? : row가 존재하지 않음으로 where에 true가 들어가고 insert문이 실행됨
쿼리 실행 결과
sn가 1인 데이터가 없기 때문에 insert로 새로운 데이터가 추가되었다.
sn가 1인 데이터가 update 처리 되었다.
개인적으로 정리한 내용을 간단하게 풀어 작성했습니다. 이해가 안가는 부분은 댓글 남겨주시면 설명해드리겠습니다. |
'DB > PostgreSQL' 카테고리의 다른 글
DBeaver PostgreSQL Create한 table이 보이지 않을때 해결법 (0) | 2023.11.29 |
---|---|
PostgreSQL text to jsonb 역슬래시 제거 (0) | 2023.11.28 |
PostgreSQL 다중 Update - batch update (0) | 2022.10.06 |
DBeaver PostgreSQL 모든 Database 조회하기 (0) | 2022.06.17 |
[PostgreSQL] jsonb 특정 순번의 데이터 조회 (0) | 2022.04.25 |
Comments