신입으로 입사후 처음 받은 과제를 풀던 중
이미 해당 id에 해당하는 사람에 관한 정보가 있으면 update
없으면 insert를 해야할 일이 생겼다.
이런 로직은 캠프에서 JPA를 이용할 때는 service단에서 DB를 한번 조회를 하고
없으면 데이터를 넣고 있으면 업데이트를 하면 될 일이었다.
그런데 회사에서는 mybatis를 사용중이고 sql에서 한번에 처리를 해야했다.
따라서 검색을 하던 중 MERGE를 사용하는 방법이 있다는 것을 알았다.
- "Oracle 데이터베이스에서 두 테이블 간에 조건에 따라 데이터를 삽입하거나 갱신하는데 사용되는 SQL 문"
- 하나의 쿼리문으로 INSERT, UPDATE, DELETE 작업을 해야할 때.
두 테이블간??
필자는 하나의 테이블에서 사용했기 때문에 DUAL을 사용했다.
MERGE INTO table_name tmp
USING DUAL
ON (tmp.USER_ID = #{login_user_id}
AND tmp.PRO_ID = #{PRO_ID})
WHEN MATCHED THEN
UPDATE SET
TOTAL_SCORE = #{TOTAL_SCORE}
,CONTENT = #{CONTENT}
WHEN NOT MATCHED THEN
INSERT (
USER_ID
,PRO_ID
,TOTAL_SCORE
,CONTENT
) VALUES (
#{login_user_id}
,#{PRO_ID}
,#{TOTAL_SCORE}
,#{CONTENT}
)
예제에서는 데이터를 입력받아서 쿼리에서 사용했기 때문에 DUAL을 사용했지만
입력할 데이터를 테이블에서 가져올 경우 USING에 해당 테이블을 넣어주고
그 테이블의 값을 사용하면 된다.
++
MySQL에서는 ON DUPLICATE KEY UPDATE 를
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATE
column1 = value1, column2 = value2, ...;
PostgreSQL에서는 ON CONFLICT ... DO UPDATE 를 사용해보자.
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON CONFLICT (conflict_column)
DO UPDATE SET
column1 = value1, column2 = value2, ...;