본문 바로가기

Database/MySQL

[MySQL] TEMPORARY TABLE 사용하기 #2 (BULK INSERT)

 

[MySQL] TEMPORARY TABLE 사용하기 #1

시작하기 전... 엑셀 업로드 후 저장시 대량으로 DB에 업로드 해야 할 일이 생겼다. 그래서 MySQL의 TEMPORARY TABLE 을 이용해 일괄 등록 후 TEMPORARY TABLE에 등록된 데이터로 정합성 체크 까지 하는 로직

shinechan.tistory.com

앞에서(위 링크 참조) TEMPORARY TABLE 생성과 삭제하는 구문에 대해 작성했는데 이어서

생성한 TEMPORARY TABLE을 사용하여 다량의 데이터를 INSERT 하고 실제 사용 테이블에 INSERT 하기 전 데이터의 정합성 체크까지 하는 예제를 작성하겠다. 그리고 BULK INSERT를 MyBatis에서 사용하는 부분도 함께 작성


BULK INSERT를 하는 이유?

많은 행을 삽입해야 하는 경우 BULK INSERT 구문을 사용하여 클라이언트와 서버 간의 통신 오버헤드를 줄입니다.

 

BULK INSERT 사용 예시

INSERT INTO TMP_TABLE_NAME VALUES (1,2,3,4), (5,5,5,5), ...;

OR

INSERT INTO TMP_TABLE_NAME (COLUMN_1, COLUMN_2, COLUMN_3, COLUMN_4)
VALUES (1,2,3,4), (5,5,5,5), ...;

 

*참고 INSERT 구문

INSERT INTO TMP_TABLE_NAME (COLUMN_1, COLUMN_2, COLUMN_3, COLUMN_4) VALUES (1, 2, 3, 4);

 

MyBatis에서 BULK INSERT 예시

<insert id="insertTmpTableUpList" parameterType="java.util.List">
  INSERT INTO TMP_TABLE_NAME (COLUMN_1, COLUMN_2, COLUMN_3, COLUMN_4)
  VALUES
  <foreach collection="upList" item="item" separator=",">
    (#{item.COLUMN_1}, #{item.COLUMN_2}, #{item.COLUMN_3}, #{item.COLUMN_4})
  </foreach>
</insert>

 

기존 테이블 INSERT 하기 전 정합성체크 해보기

대상 테이블에 INSERT 하기전 SQL로 정합성 체크 후 사용자에게 결과를 알려주기 위해 아래처럼 작성 해봤다

SELECT A.*
     , SUM(CASE WHEN LENGTH(A.ERR_MSG) > 0 THEN 1 ELSE 0 END) OVER() AS ERR_CNT
  FROM (
         SELECT COLUMN_1
              , COLUMN_2
              , COLUMN_3
              , COLUMN_4
              , ( CASE WHEN LENGTH(TMP.COLUMN_1) < 5 THEN '컬럼1 길이를 확인하세요'
                       WHEN COUNT(1) OVER(PARTITION BY TMP.COLUMN_1) > 1 THEN '중복데이터 입니다'
                       /* 그밖에 INSERT 대상테이블의 정합성체크 */
                   END
              ) AS ERR_MSG
           FROM TMP_TABLE_NAME TMP
       ) A

 

 

 

참고사이트

https://dev.mysql.com/doc/refman/8.0/en/optimizing-innodb-bulk-data-loading.html