Oracle MERGE 정리

형기브·2023년 12월 25일

SQL

목록 보기
5/5

신입으로 입사후 처음 받은 과제를 풀던 중
이미 해당 id에 해당하는 사람에 관한 정보가 있으면 update
없으면 insert를 해야할 일이 생겼다.
이런 로직은 캠프에서 JPA를 이용할 때는 service단에서 DB를 한번 조회를 하고
없으면 데이터를 넣고 있으면 업데이트를 하면 될 일이었다.
그런데 회사에서는 mybatis를 사용중이고 sql에서 한번에 처리를 해야했다.
따라서 검색을 하던 중 MERGE를 사용하는 방법이 있다는 것을 알았다.

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}
            )
  • MERGE INTO 삽입,갱신할 테이블 명.
  • USING 삽입,갱신할 데이터를 가진 테이블 명
  • ON ( 조건 ) 조건에 부합하는 row가 있으면 UPDATE 아니면 INSERT
  • WHEN MATCHED THEN 조건에 부합할 경우
  • WHEN NOT MATCHED THEN 조건에 부합하지 않을 경우

예제에서는 데이터를 입력받아서 쿼리에서 사용했기 때문에 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, ...;
profile
Slow but Steady

0개의 댓글