반응형
PostgreSQL에는 DML(INSERT, UPDATE, DELETE)
실행 후, affected rows 갯수 대신 정보를 반환해주는 구문이 있다.
그것이 바로 RETURNING
구문이다
사용방법은 아주아주 간단하다!!
INSERT, UPDATE, DELETE문
뒤에 RETURNING \*
을 쓰면 실행 결과 ROWS를 반환한다.
이 흥미로운 문법을 아래의 활용 예제를 보면서 RETURNING
을 어떻게 쓸 수 있는지 자세히 살펴보자👩🤟
Examples
활용1. SELECT KEY
Spring 환경에서 우리는 insert(혹은 update)
에서 SQL 실행 후 특정 값을 반환하고 싶을 때, 대게의 경우에 mybatis
(혹은 ibatis)를 이용하여 이렇게 썼을 것이다.
//old
<insert>
INSERT INTO BOARD(BOARD_ID, TITLE, CONTENT)
VALUES('A01', '게시글 타이틀', '게시글 내용')
<selectKey keyProperty="" resultType="" order="AFTER" >
SELECT BOARD_ID
</selectKey>
</insert>
하지만 PostgreSQL 에서는 mybatis없이 이렇게도 쓸 수 있다!
//new
<insert>
INSERT INTO BOARD(BOARD_ID, TITLE, CONTENT)
VALUES('A01', '게시글 타이틀', '게시글 내용')
RETURNING BOARD_ID
</insert>
확실히 insert안에 select가 들어가있는것 보다 가독성도 좋아보이고,
반환(RETURNING)한다는 의미와 해달 컬럼이 더 잘 전달된다.
편안~
활용2. UPSERT
두번째 활용 예는 UPSERT이다.
많은 사용자들이 알듯이 PostgreSQL에는 오라클의 MERGE문이 없다 (T-T)/
그래서 오라클의 그것과 같은 동작을 위해 우리는 PostgreSQL의 WITH를 활용할 수 있다.
//update할 row가 없으면 insert 하는 upsert(merge)문
WITH UPSERT AS (
UPDATE BOARD
SET TITLE = '게시글 타이틀 수정'
, CONTENT = '게시글 내용 수정'
WHERE BOARD_ID = 'A01'
RETURNING *
)
INSERT INTO BOARD(
BOARD_ID
, TITLE
, CONTENT
)
SELECT
BOARD_ID
, TITLE
, CONTENT
WHERE NOT EXISTS ( SELECT * FROM UPSERT )
PostgreSQL의 UPSERT문은 여기에서 이전에 한번 다룬적이 있으니, 두 SQL을 비교해보면서 본인의 상황에 적절한 것을 골라서 써볼 수 있도록 하자!
참고
- PostgreSQL With : https://www.postgresql.org/docs/9.4/queries-with.html
- PostgreSQL Insert Multi-Rows : https://www.postgresqltutorial.com/postgresql-insert-multiple-rows/
반응형
'Database' 카테고리의 다른 글
[Database] Stored Procedure란? 개념과 장담점 알아보기 (0) | 2024.04.04 |
---|---|
날짜 타입, Timestamp와 Datetime의 차이 알아보기 (0) | 2021.12.27 |
[PostgresQL] 중복데이터 제거하고 하나만 남기기 (1) | 2021.11.28 |
[PotsgresQL] 이 없으면 잇몸으로! MERGE 대신 UPSERT 사용하기 (0) | 2021.11.23 |
[Database] 이클립스(eclipse)와 오라클(Oracle) 연동하기 (3) | 2019.04.23 |