앞에서(위 링크 참조) 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
'Database > MySQL' 카테고리의 다른 글
[MySQL] UPSERT, INSERT ON DUPLICATE UPDATE 등록 또는 수정 (0) | 2023.05.04 |
---|---|
[MySQL] REPLACE INTO, DELETE INSERT 대체 (0) | 2023.05.03 |
[MySQL] TEMPORARY TABLE 사용하기 #1 (0) | 2023.04.06 |